Embedded/Programming language : C

[C] 매크로 함수에서 do~while(0)을 쓰는 이유

별빛의온기 2022. 10. 26. 13:26
반응형

 

매크로 함수를 보다보면 do~while(0) 형태로 되어있는것을 보게 됩니다.

#define add(a,b,c) do{a = a + b; }while(0)  
 

왜 이렇게 사용하는지 한번 알아볼께요.

 

아래는 일반적인 매크로 함수 입니다.

#include <stdio.h>

#define add(a,b,c) {a = a + b; \
c = a + b;}  

void main()
{
	int a = 300, b = 200, c;

	if (a > b)
	{
		add(a, b, c);    //if에 { } 를 사용!
	}
	else
	{
		printf("Test");   //else에 { } 를 사용!
	}

	printf("[ %d %d %d] \n", a, b, c);
}
 

위 코드를 컴파일 해보면 정상적으로 동작합니다.

 

자 이제 if와 else의 소괄호를 없애고 진행해볼께요.

#include <stdio.h>

#define add(a,b,c) {a = a + b; \
c = a + b;}  

void main()
{
	int a = 300, b = 200, c;

	if (a > b)
		add(a, b, c);    //Error!
	else           		
                printf("Test");   

	printf("[ %d %d %d] \n", a, b, c);
}
 

달라진거라고는 소괄호를 지운것뿐인데 Error가 발생합니다. 왜 그런걸까요?

 

조건문을 풀어보면 다음과 같아집니다.

if (a > b) 
{
        a = a + b; 
        c = a + b;
};
else
        printf("Test");
 
 

어색함이 보이시나요? 바로 else전에 ;(세미콜론)이 붙는다는것입니다. 이러한 문법적인 오류로 인하여 컴파일러는 Error를 발생시킨것이죠.

 

이 문제를 해결하기 위해

add(a, b, c); 을

add(a, b, c) 로 수정하면 Error가 나지 않지만 왠지 어색하고 신경이 많이 쓰입니다.

 

이러한 문제를 해결가능한것이 바로 do~while(0)입니다.

#include <stdio.h>

#define add(a,b,c) do{a = a + b; \
c = a + b;}while(0)  

void main()
{
	int a = 300, b = 200, c;

	if (a > b)
		add(a, b, c);
	else
		printf("Test");

	printf("[ %d %d %d] \n", a, b, c);
}
 

do~while(0)로 묶어놓으면 한번만 수행할뿐더러, 조건문을 풀어쓰면

if (a > b) 
        do{
                a = a + b; 
                c = a + b;
        }while(0);   
else
        printf("Test");
 

로 자연스럽게 되니 문법적인 Error가 나질 않습니다.

 

 

 

반응형