do { … } while(0) in MACRO

– 매일같이 잊어버려서 아예 기록을 해둡니다…

왜 C에서는 #define some_func() do { … } while(0) 와 같이 매크로를 정의하는가.. 그 이유는,

if (…)
  some_func();
else
  other_func();

가 잘 번역되게 하기 위해서입니다. 만약 block statement를

#define bad_func() { … }

로 정의한다면, 자연스러워 보이는 다음의 코드는

if (…)
  bad_func();
else
  other_func();

실제로 다음과 같이 번역됩니다.

if (…)
  { … };
else
  other_func();

당연히 error죠?

그러나 EC++에서는 type safe하고, 실행 문맥에 따라 실행 내용이 달라지는 매크로보다는 inline 또는 const를 사용하라고 권하고 있습니다. 그래서 결국은 C가 우세한 임베디드나 커널에서 많이 나오는 idiom.

Similar Posts:

Post a Comment

Your email is never published nor shared.