매크로 함수

나도 c언어를 깊게 파보기 전까지는 많이 했던 실수 중에 하나가 매크로 함수를 상수처럼 생각하고 대충 바뀌면 안되는 값들을 저기에 넣었던 것이다.
이후 내 실수가 무엇인지 알게된 후 주변에 c 좀 친다 하는 지인들에게 대화를 청했는데, 놀라운 것은 다들 야 나두를 시전했다는 것이다.

결과론적으로는 똑같잖아요

오늘 til은 내 건강이 너무 안좋은 관계로 약간 가볍게 작성할 생각이다.
결과론적인 것만 따질거면 그냥 파이썬으로 가라 제발 ㅂㄷㅂㄷ은 농담이고(이를 깨문 농담이지만), c언어를 그렇게 대하게 되면 어느 순간인거부터 막히는 시점이 온다.
내가 c언어 고수라서 하는 말은 아니고, 바로 거기에서 막혀서 내가 c를 포기하고 stl때문에 c++을 다시 시작한 얌생이여서 잘 안다.
c언어를 결과론적으로만 대하게 되면 왜 고수들이 헤더파일들을 마지막에 utills.h뭐 이런식으로 엮어서 관리하는지 c는 객체지향이 아니라면서 왜 enum따위를 사용하는지 절대 이해할 수 없게 된다.(사실 이렇게 헤더파일 묶는 법은 나도 4일 전인가에 처음 알았지만 아는 척 하고 싶어서요)

단계의 차이

얼마전에 굉장히 놀란 것 중 하나가 하드웨어 개발자인 지인이 자신은 const는 쓰지만, 매크로함수는 쓰지 않는다고 말한 것이었다.
c언어에서 const를 통해 정의하는 상수는 컴파일 단계에서 컴파일 된다.
간단하게 설명하자면, 다른 애들과 똑같은 단계에서 똑같이 기계적인 처리를 거친다는 것이다.
그러나 매크로함수는 그보다 앞서 #include와 같은 친구들을 처리하는 전처리 단계에서 작업이 이루어지고 그 때문에 몇가지 디테일한 차이가 발생하게 된다.

하드웨어 개발자들은 매크로 함수를 극혐한다?

퀴즈를 통해 재귀에 취하고, 신경과 약에 취하고 하루 종일 아무것도 안먹어서 물에 취한 김에 🦮소리하는 게 아니라 정말 그렇다.
그 이유는 디버깅 시 문제 지점을 정확하게 파악하기 어렵기 때문이다.
전처리기 단계에서 이루어지는 매크로 함수의 변환은 단순한 텍스트 치환에 가깝다.
비주얼 스튜디오에서 전역이나 지역에서 생긴 오류는 나름(?) 친절하게 알려주는 반면, 전처리기 단계인 매크로 함수에다가 치명적인 실수를 박아놓으면 아무것도 알려주지 않는다.
게다가 하드웨어는 특성상 문제가 생기면, 돈은 돈대로 많이 깨지고 코드 문제인지 부품 문제인지 찾는 데에 걸리는 시간이 상당하다.
그래서 그런가 검색을 해보니 그들은 인라인 함수를 쓰나보다..역시 임베디드는 태어날 때부터 축하드립니다 당신은 임베디드에 당첨되셨습니다로 태어나는 것 같다.

템플릿 함수

c에서는 쓸 수 없지만 c++에서는 타입까지 무려 자동으로 검사해주는 귀중하고 알찬 친구를 제공해준다.
c에서 쓰이는 웬만한 좋은 애들은 다 c++에서도 쓸 수 있는 데다가 추가 기능까지 주니 그냥 다들 c++로 오세요.
저희 가게 아직 영업중입니다.

본론으로 돌아가서

const는 그냥 여러분들이 알고있는 상수입니다.
찐 상수 다른 언어에서 말하는 그 val이라는 친구 저희도 있어요.
그 혹시나 해서 하는 말이지만 c언어에는 private없고 c++에는 있어요..다시한번 말합니다 저희 집 아직 영업중입니다.

앞으로에 대한 짧은 계획

약이 안듣는 두통을 신경과 교수님한테 가서 말했다가 탈탈탈탈 탈수기 당하고 왔다.
퀴즈도 조짐성 편두통 때문에 약간 눈이 이상하게 보여서 잘못된 말 적어놓은 게 몇개 있고, 교수님이 나더러 유산소 빼액 카페인 빼액 코딩은 빼액 하지 않고, 목만 풀어 빼액을 시전하셨으므로 시간날 때 랫풀다운이나 데드리프트를 하러 지하로 내려가야겠다(데드리프트 하고 나면 등이 찢기면서 굳어있던 목뼈가 자라난다구요).
예방약은 setter, 진통제는 getter다 명심하자.

태그:

카테고리:

업데이트:

댓글남기기