본문 바로가기
C

매크로

by KWONE 2024. 7. 9.

단순 매크로

#define SIZE 100
#define AND &&
#define OR ||
#define NOT !

함수 매크로

#define SUM(x,y) ((x)+(y))
#define MAX(x,y) ((x)>(y))?(x):(y)

일반적인 함수 사용과 달리 매개변수의 자료형을 써주지 않아도 된다.

그러나 다음과 같이 증감 연산자를 사용하면 원치않은 결과가 나오기도 한다.

#define SQUARE(x) ((x)*(x))

int main ()
{
	int x=2;
    printf("%d\n",SQUARE(++x));	//9가 아니고 16이 출력된다. 
                                // ++x * ++x 결과적으로 x의 값이 두번 증가하게된다.
    return 0;
}

# 연산자

#include <stdio.h>

#define PRINT(exp) printf("exp=%d\n",exp)

int main()
{
	int x = 5;

	PRINT(x);	//printf("exp=%d\n",x);로 변환된다.
	return 0;
}

exp를 변수로 생각하고 x=5로 출력을 원했으나 이렇게 나왔다.

전처리기는 큰따옴표 안의 exp는 치환하지 않는다. 끈따옴표 안의 exp도 x로 치환되게 하려면 exp 를 끈따옴표 밖에 위치시켜야 한다.

그리고 전달된 인수인 x를 문자열로 만들어야 하므로 매개변수 앞에 #d을 붙여야 한다.

#define PRINT(exp) printf(#exp" = %d\n",exp);	//printf("x""=%d\n",x);

내장 매크로

내장 매크로 설명
__DATE__ 컴파일 된 날짜로 치환됨
__TIME__ 컴파일된 시간으로 치환됨
__LINE__ 소스 파일에서의 현재의 라인 번호로 치환된다.
__FILE__ 소스 파일 이름으로 치환된다.

지난번에 날짜 출력하는 코드를 짜려고 <time.h> 부터 어렵게 접근을 한적이 있었는데

내장 매크로인 __DATE__를 사용하면 바로 날짜가 출력가능함을 알게되었다.

2024.06.23 - [C,C++/C] - 날짜 구현

ASSERT 매크로 예제

프로그램을 디버깅할 때 자주 사용되는 ASSERT는 어떤 전제 조건을 검사하는데 사용된다.

#include <stdio.h>

#define ASSERT(exp) if(!(exp))\
{printf("가정("#exp")이 소스 파일 %s %d번째 줄에서 실패.\n"\
,__FILE__,__LINE__),exit(1);}

int main(void)
{
	int sum = 100;

	ASSERT(sum == 0);
	return 0;
}