#define 매크로
#define은 전처리기(Preprocessor) 지시문이다.
컴파일하기 전에 코드의 특정 문자열을 다른 값으로 치환할 수 있다.
#define 이름 값
예시:
#define MAX_HP 100
int hp = MAX_HP;
컴파일 전에 다음과 같이 치환된다.
int hp = 100;
특징
- 컴파일 전에 단순 텍스트 치환
- 변수가 아님
- 타입이 존재하지 않음
- 메모리에 저장되지 않음
- 세미콜론(
;)을 사용하지 않음
#define PI 3.14
매크로 함수
함수처럼 사용할 수도 있다.
#define SQUARE(x) ((x) * (x))
사용 예시:
int a = SQUARE(3);
컴파일 전에 다음과 같이 치환된다.
int a = ((3) * (3));
결과:
a = 9
괄호를 사용하는 이유
매크로는 단순 치환이기 때문에 괄호가 없으면 예상치 못한 결과가 나올 수 있다.
잘못된 예시:
#define SQUARE(x) x * x
int a = SQUARE(1 + 1);
치환 결과:
int a = 1 + 1 * 1 + 1;
연산 우선순위 때문에 실제 계산은
1 + (1 * 1) + 1
이 되어 결과가
3
이 된다.
올바른 예시:
#define SQUARE(x) ((x) * (x))
int a = SQUARE(1 + 1);
치환 결과:
((1 + 1) * (1 + 1))
결과:
4
#undef
#define으로 정의한 매크로를 해제하는 명령어이다.
#define A 10
#undef A
이후에는 A가 더 이상 10으로 치환되지 않는다.
#define A 10
int x = A; // 10
#undef A
int y = A; // 오류 발생
정리
| 명령어 | 설명 |
|---|---|
#define |
매크로 정의 |
#define SQUARE(x) |
매크로 함수 정의 |
#undef |
매크로 해제 |
핵심
- 컴파일 전에 텍스트를 치환한다.
- 변수처럼 메모리에 저장되지 않는다.
- 타입이 존재하지 않는다.
- 매크로 함수는 괄호를 반드시 사용한다.
#undef로 매크로를 제거할 수 있다.