매크로

정의

  • #define 으로 정의된 이름을 해당 값 또는 코드 패턴으로 단순 치환한다.
  • 자주 사용되는 명령이나 수식 또는 상수에 대해 이를 대표하는 이름(=매크로 이름)을 붙여 사용한다.
  • 매크로를 해제할 때에는 #undef 지시어를 사용한다.

표현

표현 설명
#define 매크로명 상수값 매크로 상수
#define 매크로명(인수리스트) (수식) 매크로 함수
#undef 매크로 해제

예시

(1) 기본적인 매크로 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
#define MACRO_VALUE 5 // 매크로 상수 (전역)
#define MACRO_FUNC(a, b) (MACRO_VALUE * (a) * (b)) // 매크로 함수 (전역)

int main(){
	int x = 10;
	int y = 20;
	printf("MACRO RESULT : %d\n", MACRO_FUNC(x, y));
	return EXIT_SUCCESS;
}
-------------------------------------------------------
>> MACRO RESULT : 1000
1
2
3
4
5
6
7
// 원리 : 중간파일이 아래와 같이 생성됨 (파일 포함 부분은 제외하고 설명)
int main(){
	int x = 10;
	int y = 20;
	printf("MACRO RESULT : %d\n", (5 * (x) * (y)));
	return EXIT_SUCCESS;
}

(2) 매크로 재정의

  • 매크로를 다시 정의하면 덮어씌워진다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
#define MACRO_VALUE 5 // 매크로 상수 (전역)
#define MACRO_FUNC(a, b) (MACRO_VALUE * (a) * (b)) // 매크로 함수 (전역)

int main(){
	#define MACRO_VALUE 1000 // 경고가 발생(redefine 되었다는 경고), 에러는 아님.
	int x = 10;
	int y = 20;
	printf("REDEFINE_MACRO : %d\n", MACRO_FUNC(x, y));
	return EXIT_SUCCESS;
}
-------------------------------------------------------
>> REDEFINE_MACRO : 200000
1
2
3
4
5
6
7
// 원리 : 중간파일이 아래와 같이 생성됨 (파일 포함 부분은 제외하고 설명)
int main(){
	int x = 10;
	int y = 20;
	printf("MACRO RESULT : %d\n", (1000 * (x) * (y)));
	return EXIT_SUCCESS;
}

(3) 매크로는 모두 전역이다.

  • 매크로는 전역과 지역을 나누지 않는다.
  • 단순히 텍스트 치환만을 수행한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#define MACRO_VALUE 5 // 매크로 상수 (전역)
#define MACRO_FUNC(a, b) (MACRO_VALUE * (a) * (b)) // 매크로 함수 (전역)

void after_re_define_in_block(){
	int x = 10;
	int y = 20;
	printf("AFTER REDEFINE : %d\n", MACRO_FUNC(x, y));
}

int main(){
	#define MACRO_VALUE 1000
	int x = 10;
	int y = 20;
	printf("REDEFINE_MACRO : %d\n", MACRO_FUNC(x, y));
	after_re_define_in_block();
	return EXIT_SUCCESS;
}
-------------------------------------------------------
>> REDEFINE_MACRO : 200000
>> AFTER REDEFINE : 200000

(5) 매크로 해제

  • 해제된 매크로 값은 더이상 사용할 수 없다.
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
#define MACRO_VALUE 5 // 매크로 상수 (전역)
#define MACRO_FUNC(a, b) (MACRO_VALUE * (a) * (b)) // 매크로 함수 (전역)

int main(){
	#undef MACRO_VALUE
	int x = 10;
	int y = 20;
	printf("UNDEFINE MACRO : %d\n", MACRO_FUNC(x, y)); // -> 오류발생
	return EXIT_SUCCESS;
}
1
2
# 오류 내용
"식별자 "MACRO_VALUE"이(가) 정의되어 있지 않습니다."

(4) 매크로와 변수의 이름 충돌

  • 매크로로 선언된 이름은 변수로 사용할 수 없다.
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>
#define MACRO_VALUE 5 // 매크로 상수 (전역)
#define MACRO_FUNC(a, b) (MACRO_VALUE * (a) * (b)) // 매크로 함수 (전역)

int main(){
	int MACRO_VALUE = 5000; // --> 오류 발생 : 식별자가 필요합니다.
	return EXIT_SUCCESS;
}
1
2
# 오류 내용
"식별자가 필요합니다."

(5) 매크로 함수를 사용할 때 괄호의 중요성

  • 매크로 함수를 사용할 때에는 적극적으로 괄호를 써 주는 게 좋다.
1
2
3
4
5
6
7
8
9
10
void caution_at_using_macro(){
	#define MACRO_VALUE 1000
	#define MACRO_FUNC(a, b) (MACRO_VALUE * a * b)
	int x = 5;
	int y = 15;
	printf("CAUTION AT USING MACRO [WRONG]: %d\n", MACRO_FUNC(x+5, y+5));
	
	#define MACRO_FUNC(a, b) (MACRO_VALUE * (a) * (b))
	printf("CAUTION AT USING MACRO [CORRECT]: %d\n", MACRO_FUNC(x+5, y+5));
};
1
2
3
# 출력
CAUTION AT USING MACRO [WRONG]: 5080
CAUTION AT USING MACRO [CORRECT]: 200000
1
2
3
4
5
6
7
8
9
10
11
// 원리 : 아래와 같이 중간파일이 만들어지
void caution_at_using_macro(){
	#define MACRO_VALUE 1000
	#define MACRO_FUNC(a, b) (MACRO_VALUE * a * b)
	int x = 5;
	int y = 15;
	printf("CAUTION AT USING MACRO [WRONG]: %d\n", (1000 * 5 + 5 * 15 + 5));
	
	#define MACRO_FUNC(a, b) (MACRO_VALUE * (a) * (b))
	printf("CAUTION AT USING MACRO [CORRECT]: %d\n", (1000 * (5 + 5) * (15 + 5)));
};

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments