반응형
매크로 함수를 보다보면 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가 나질 않습니다.
반응형
'Embedded > Programming language : C' 카테고리의 다른 글
[C] Typedef 손쉽게 이해하기. (1) | 2022.10.27 |
---|---|
[C] 매크로 함수 이해하기 (0) | 2022.10.26 |
[C] 비트필드 (0) | 2017.04.05 |
[C] for문에서 두개 이상 연산하기. (0) | 2017.04.05 |
[C] 정수 연산시 반올림 연산 방법 (0) | 2015.01.28 |