컴파일 과정에서 컴파일 하기 전에 헤더 파일을 포함하고 매크로 확장을 하는 단계입니다. #include 구문을 만나면 헤더파일을 찾아 그 내용을 순차적으로 삽입합니다. 매크로 치환 및 적용(#define, #ifdef와 같은 전처리기 매크로 치환 및 처리)합니다.
따라서 전처리 과정에서 사용할 수 있는 매크로 치환 및 적용에 대해서 알아보겠습니다.
매크로 상수는 어떤 글자를 숫자로 바꾸는 것입니다.
#define PI 3.14
이런식으로 선언했다고 한다면, 전처리기에 의해서 모든 PI가 전처리 후에는 3.14로 바뀌어 버립니다. 수학적으로 생각한다면, 치환에 가깝다고 생각합니다.
예시
#include <stdio.h>
#define PI 3.14
int main() {
int r = 3;
double area = 0.00;
area = r * r * PI;
printf("반지름이 3인 원의 넓이는: %lf", area);
return 0;
}
결과
반지름이 3인 원의 넓이는: 28.26
매크로 함수는 상수와 비슷하게 글자를 함수로 바꾸는 것입니다.
#define PI 3.14
#define SQUARE(X) ((X)*(X)*(PI))
이런식으로 선언했다면, X에 값을 넣으면 값이 전처리과정에서 값이 계산되어 반환됩니다.
예시
#include <stdio.h>
#define PI 3.14
#define SQUARE(X) ((X)*(X)*(PI))
int main() {
double area = SQUARE(3);
printf("반지름이 3인 원의 넓이는: %lf", area);
return 0;
}
결과
반지름이 3인 원의 넓이는: 28.26
정의에도 if함수와 같은 조건문이 존재합니다. #ifdef와 #ifndef인데 말 그대로 #ifdef는 '정의가 됐다면', #ifndef는 '정의가 안됐다면'입니다. 둘 다 #endif와 같이 사용합니다.
예시
#define TREE
#ifdef TREE
int main() {
printf("정의가 됐습니다.");
return 0;
}
결과
정의가 됐습니다.
#define PI 3.14 //매크로 상수
#define SUM(x, y) ((x) + (y)) //매크로 함수
#define MAINSTART int main(){
#define MAINEND }
#define NORTH 0
#define SOUTH 1
#define EAST 2
#define WEST 3
enum Diretion { //열거형
North,
South,
East,
West
};
//조건부 컴파일 명령어
#define WINDOWS
MAINSTART
int direction = 0;
switch (direction) {
case North:
printf("북쪽\n");
break;
case South:
printf("남쪽\n");
break;
case EAST:
printf("동쪽\n");
break;
case WEST:
printf("서쪽\n");
break;
}
#ifdef WINDOWS
int radius = 1;
float circleArea = PI * radius * radius;
printf("radius 1인 원의 면적은 %f\n", circleArea);
int sum = SUM(10 * 2, 20);
sum = (10 * 2) + 20;
printf("sum = %d\n", sum);
#endif
return 0;
MAINEND
결과
북쪽
radius 1인 원의 면적은 3.140000
sum = 40