매크로

이인혁·2024년 5월 23일

C

목록 보기
21/23

1. 전처리

컴파일 과정에서 컴파일 하기 전에 헤더 파일을 포함하고 매크로 확장을 하는 단계입니다. #include 구문을 만나면 헤더파일을 찾아 그 내용을 순차적으로 삽입합니다. 매크로 치환 및 적용(#define, #ifdef와 같은 전처리기 매크로 치환 및 처리)합니다.

따라서 전처리 과정에서 사용할 수 있는 매크로 치환 및 적용에 대해서 알아보겠습니다.

2. 매크로 상수

매크로 상수는 어떤 글자를 숫자로 바꾸는 것입니다.

#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

3. 매크로 함수

매크로 함수는 상수와 비슷하게 글자를 함수로 바꾸는 것입니다.

#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

4. #ifdef, #ifndef

정의에도 if함수와 같은 조건문이 존재합니다. #ifdef와 #ifndef인데 말 그대로 #ifdef는 '정의가 됐다면', #ifndef는 '정의가 안됐다면'입니다. 둘 다 #endif와 같이 사용합니다.

예시

#define TREE

#ifdef TREE
int main() {
	printf("정의가 됐습니다.");
    
    return 0;
}

결과

정의가 됐습니다.

5. 사용 예

#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
profile
게임개발공부블로그

0개의 댓글