#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
댓글 없음:
댓글 쓰기