2009-05-29 3 views

답변

131

세미콜론을 사용하여 모양을 만들고 기능처럼 작동 할 수 있습니다. if/else 절도 제대로 작동합니다. 매크로 후 세미콜론은 다른 절을 "먹는 것"이라고 이후 잠시없이

(0), 위의 코드는

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

와 함께 작동하지 않을 것입니다, 그리고 위의 컴파일도하지 않을 것입니다.

+5

하지만 영업 이익의 질문은 약자

편집. 왜 {(ptr) -> next ...} 대신에 {(ptr) -> next ...}하는 동안 (0); –

+26

arno가 설명했습니다. "{(ptr) -> 다음으로 ...};"로 확장됩니다. " 따라서 두 번째 명령문 다음에 명령문이옵니다. 구문이 "if (expression) statement else statement"인 경우. "if (expression) statement statement"(하나의 "{...}"및 하나의 ";"문)을 작성 했으므로 else는 if와 연관되지 않습니다. –

+3

Amo가 말했듯이 매크로를 세미콜론으로 끝나야하는 C 문장으로 만들 수있는 영리한 트릭입니다. 명령문 구성 및 종료 (';'포함)가 관련되어있는 한 매크로는 함수 호출과 똑같이 작동합니다. – Eddie

41

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

는 같은 한 가정 : 매크로가 캡슐화없이 정의 된 경우

if (foo) 
    INIT_LIST_HEAD(bar); 

을 {...} (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

+7

이것은 매크로의 do .. while (0) 부분을 설명하지 않고, {} 중괄호 만 사용합니다. – SPWorley

+0

do {}이 부분에 설명되어있는 동안이 하나는 dup입니다. – adobriyan

+1

SPWorley, adobriyan : 사실이 게시물의 작성자가 do {} while (0)을 설명하는 링크를 추가 한 것처럼 보입니다. – Jamer