매크로를 정의할 때 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
'IT이야기' 카테고리의 다른 글
하위 항목 vueJ 간에 "활성" 클래스를 전환합니다.2 (0) | 2022.07.23 |
---|---|
java 디렉토리에 파일을 작성하려면 어떻게 해야 합니까? (0) | 2022.07.23 |
Vue2 + Vuex 커밋이 실행되지 않음(Vue devtools 미포함) (0) | 2022.07.23 |
소품 포함 VueJ 중첩 목록 렌더링 (0) | 2022.07.23 |
Sinon은 Vue 이벤트에 의해 트리거된 Vue 컴포넌트 메서드를 어떻게 감시합니까? (0) | 2022.07.19 |