코드를 보다가 do .. while (0); 이 있어서 이게 대체 뭐지? 하고 찾아봤습니다

 

#define FOO(x) foo(x); bar(x)

if (condition)
    FOO(x);
else // syntax error here
    ...;


// 실제로 해석되면
if (condition)
    foo(x); bar(x);  // 이 부분이 문제가 됩니다
else
    ...;

매크로를 여러 statement로 구성했을 때, 중괄호 없는 if 문에 들어가면 위처럼 문법에러가 발생합니다

해결방법은 매크로를 쓸 때 if에는 무조건 중괄호를 넣도록 강제할 수도 있겠지만, 지켜질지 아닐지는 모르죠. 라이브러리로 만든다면 더더욱 보장할 수 없고요

 

#define FOO(x) do { foo(x); bar(x); } while (0)

그래서 이렇게 do {...} while (0) 형식으로 쓰면 중괄호 없이 if문을 사용하더라도 정상동작하는 매크로를 만들 수 있습니다

 

Reference

- https://stackoverflow.com/q/257418/4295499

 

반응형