2009-07-01 5 views
146

가능한 중복 : 나는 몇 가지 멀티 라인 C 매크로를 본 적이
What’s the use of do while(0) when we define a macro?
Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?
do { … } while (0) what is it good for?C 멀티 라인 매크로 :/않지만 (0) 범위 블록 대

다음과 같이 do/while (0) 루프 안에 싸여 있습니다 :

 
#define FOO \ 
    do { \ 
    do_stuff_here \ 
    do_more_stuff \ 
    } while (0) 
 
#define FOO \ 
    { \ 
    do_stuff_here \ 
    do_more_stuff \ 
    } 
+4

중복 : http://stackoverflow.com/questions/1538136/ 및 http://stackoverflow.com/questions/257418/ – sth

+0

실제로 다른 방법이 있습니다. 일을 올바르게해라. ({...})는 (0) 동안 do {}와 같은 일을 할 수 있습니다. Ref : http://www.bruceblinn.com/linuxinfo/DoWhile.html – Nybble

답변

212

http://bytes.com/groups/c/219859-do-while-0-macro-substitutions

안드레이 Tarasevich :기본 블록을 사용하는 것이 아니라 코드를 그런 식으로 작성하는 혜택 (있는 경우) 무엇

사용하는 모든 생각 '할/'버전은 매크로를 작성하여 복합 명령문이 아닌 일반 명령문으로 확장하는 것입니다. 이것은 입니다. 모든 문맥에서 일반 함수를 사용하여 함수 스타일 매크로를 사용하면 균일하게 만들 수 있습니다.

다음 코드 스케치 '갑'과 '바'보통의 함수입니다

if (<condition>) 
    foo(a); 
else 
    bar(a); 

을 고려하십시오. 이제 매크로가 두 번째 방법 (에 따라 정의 된 경우,

if (<condition>) 
    CALL_FUNCS(a); 
else 
    bar(a); 

이제 위 자연의 매크로 기능 'foo는'교체하고자 거라고 상상 단지 '{'와 '} ')의'true ' 브랜치가 복합 문으로 표현되기 때문에 코드가 더 이상 컴파일되지 않습니다. 그리고 너 때 넣어 ';' 이 복합 문 다음에 'if' 문을 모두 마쳤으므로 'else'분기가 고아가됩니다 (따라서 컴파일 오류).

이 문제를 해결하는 한 가지 방법은 ';' 매크로 "호출"

if (<condition>) 
    CALL_FUNCS(a) 
else 
    bar(a); 

후이 컴파일하고 예상대로 작동하지만이 균일하지 않습니다. 좀 더 우아한 해결책은 매크로가 복합 문자가 아닌 일반 문으로 확장되는지 확인하는 것입니다. 그것을 달성하는 방법 중 하나는

#define CALL_FUNCS(x) \ 
do { \ 
    func1(x); \ 
    func2(x); \ 
    func3(x); \ 
} while (0) 

if (<condition>) 
    CALL_FUNCS(a); 
else 
    bar(a); 

아무 문제없이 컴파일 이제이 코드를 다음과 같이 에게 매크로를 정의하는 것입니다.

그러나 내 정의 과 CALL_FUNCS 사이의 작지만 중요한 차이점과 메시지의 첫 번째 버전을 유의하십시오. 나는 } while (0) 다음에 ;을 넣지 않았다.;을 정의의 끝에 넣으면 은 'do/while'을 사용하는 전체 지점을 즉시 패배시키고 해당 매크로를 복합 명령문 버전과 거의 동일하게 만듭니다 ( ).

원래 메시지에 인용 된 코드 작성자가 while (0) 이후에 ;을 넣은 이유를 모르겠습니다. 이 두 가지 변형은 에 해당합니다. 'do/while'버전을 사용하는 모든 아이디어는 이 아니며이 ;을 매크로에 포함합니다 (위의 설명은 입니다).

+35

원본 게시물은'comp.lang.c'에서 저에게 만들어졌습니다. 'bytes.com'는 소스에 대한 참조없이 comp.lang.c의 내용을 "사용"합니다. – AnT