코드를 보다가 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
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 전처리기 #, ## 연산자 (0) | 2022.10.09 |
---|---|
[C++] 자바의 <T extends E>처럼 템플릿 타입 제한하는 방법 (0) | 2022.01.02 |
[C++] Array to Pointer Decay (0) | 2021.01.29 |
[C++17] std::any에 대해 (0) | 2020.10.03 |
Visual studio Google Test 사용 예제 (0) | 2020.08.09 |