2009년 1월 10일 토요일

#define에서 do{...}while(0) 을 사용하는 이유는?

#define을 사용한 매크로 함수에서 do{...}while(0) 문을 사용하는 경우를 볼 수 있다. 왜 굳이 의미없는 do{...}while(0)를 사용하는지 아래 예제를 보면서 살펴보자.

//do{...}while(0)문을 사용하지 않은 경우
#define Inc2Each(x,y) { x+=2;y+=2;}

//do{...}while(0)문을 사용한 경우
#define Inc2Each(x,y) do{ x+=2;y+=2}while(0)

do{...}while(0)을 사용하지 않은 첫번째 방식의 경우 어떤 문제가 사용하는지 살펴보자

if ( x > y )
 Inc2Each(x,y);
else
 x=y;

위 코드는 아래와 같이 확장될 것이다.

if ( x > y )
 { x+=2;y+=2;};
else
 x=y;

즉 if 와 else 사이에 원치 않는 ; 가 포함됨으로써 예상치 못했던 오류를 만들어 내게 된다.
하지만 do{...}while(0)을 사용하면 아래와 같이 문제가 깨끗하게 해결된다.

if ( x > y )  
 do{ x+=2;y+=2;}while(0);
else  
 x=y;

혹시 아직도 뭐가 문제인지 모르겠다면...

if ( x > y )
{ 
 x+=2;
 y+=2;
}     //if 문은 여기서 끝난다.
;     //빈 라인이 되고...
else    //이 else는 if문이 없는 else가 되므로 컴파일 에러 발생할 것임.
 x=y;

자세한 내용은 http://kernelnewbies.org/FAQ/DoWhile0