단순 매크로
#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는 치환하지 않는다. 끈따옴표 안의 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;
}
'C' 카테고리의 다른 글
임시파일 (0) | 2024.07.30 |
---|---|
스트림과 파일 입출력 (성적 기록 및 계산기) (0) | 2024.07.03 |
2차원 공간상에서의 평행이동 (typedef 활용) (0) | 2024.06.30 |
문자열 처리 라이브러리 함수 (0) | 2024.06.27 |
문자열 입출력 라이브러리 (0) | 2024.06.25 |