가능한 중복 :
Do-While and if-else statements in C/C++ macros매크로를 정의 할 때 do (0)을 사용하는 것은 무엇입니까?
나는 리눅스 커널을 읽고 있어요 나는이 같은 많은 매크로를 발견 : 그들이 정의하는 대신이를 사용하는 이유는 무엇입니까
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
을 그것은 단순히 {} 안에 있습니까?
하지만 영업 이익의 질문은 약자
편집. 왜 {(ptr) -> next ...} 대신에 {(ptr) -> next ...}하는 동안 (0); –
arno가 설명했습니다. "{(ptr) -> 다음으로 ...};"로 확장됩니다. " 따라서 두 번째 명령문 다음에 명령문이옵니다. 구문이 "if (expression) statement else statement"인 경우. "if (expression) statement statement"(하나의 "{...}"및 하나의 ";"문)을 작성 했으므로 else는 if와 연관되지 않습니다. –
Amo가 말했듯이 매크로를 세미콜론으로 끝나야하는 C 문장으로 만들 수있는 영리한 트릭입니다. 명령문 구성 및 종료 (';'포함)가 관련되어있는 한 매크로는 함수 호출과 똑같이 작동합니다. – Eddie