IT이야기

매크로를 정의할 때 do while(0)이 무슨 소용이 있습니까?

cyworld 2022. 7. 23. 09:38
반응형

매크로를 정의할 때 do while(0)이 무슨 소용이 있습니까?

중복 가능성:
C/C++ 매크로에서의 Do-While 및 if-else 문
(0) 동안 {... }을(를) 수행합니다.무엇에 유효합니까?

Linux 커널을 읽고 있는데 다음과 같은 매크로를 많이 발견했습니다.

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)

{}에서 단순하게 정의하는 것이 아니라 이 기능을 사용하는 이유는 무엇입니까?

세미콜론으로 따라가서 기능처럼 보이게 할 수 있습니다.if/else 절과도 올바르게 연동됩니다.

while(0)이 없으면 위의 코드는 다음과 같이 동작하지 않습니다.

if (doit) 
   INIT_LIST_HEAD(x);
 else 
   displayError(x);

매크로 뒤의 세미콜론은 else 절을 "먹는다"고 할 것이고, 위는 컴파일조차 되지 않을 것이기 때문이다.

여러 문을 하나의 매크로로 그룹화할 수 있습니다.

다음과 같은 작업을 수행했다고 가정합니다.

if (foo) 
    INIT_LIST_HEAD(bar);

매크로가 캡슐화 없이 정의된 경우 {...}을(를) 수행합니다.} while (0);, 위의 코드는 다음과 같이 확장됩니다.

if (foo)
    (bar)->next = (bar);
    (bar)->prev = (bar);

foo가 유지되면 첫 번째 명령만 실행되므로 이것은 의도한 바가 아닙니다.두 번째 진술은 foo의 보유 여부와 상관없이 실행될 것이다.

편집: 자세한 내용은 http://c-faq.com/cpp/multistmt.html 및 http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon를 참조하십시오.

언급URL : https://stackoverflow.com/questions/923822/whats-the-use-of-do-while0-when-we-define-a-macro

반응형