반응형
    
    
    
  
매크로 함수를 보다보면 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 |