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'버전을 사용하는 모든 아이디어는 이 아니며이 ;
을 매크로에 포함합니다 (위의 설명은 입니다).
중복 : http://stackoverflow.com/questions/1538136/ 및 http://stackoverflow.com/questions/257418/ – sth
실제로 다른 방법이 있습니다. 일을 올바르게해라. ({...})는 (0) 동안 do {}와 같은 일을 할 수 있습니다. Ref : http://www.bruceblinn.com/linuxinfo/DoWhile.html – Nybble