
매크로(macro)는 프로그램에서 자주 사용되는 명령, 수식, 상숫값에 이름을 붙인 것이다. 선행처리기 #define을 사용하여 정의하며, 컴퓨터는 매크로명을 지정된 자료로 치환한 후 컴파일하는 작업을 수행한다. 매크로 정의는 매크로 상수 정의, 매크로 함수 정의로 나뉜다.
<매크로 사용 주의사항>
⌨️ 예제 1
// 매크로 상수 정의
#include <stdio.h>
#define ZIP_CODE 24582 // 정수형 상수
#define TEL "1234-5678" // 문자열 상수
#define PRINT_HELLO printf("hello\n"); // printf("hello\n"); 자체가 매크로여서 ; 포함
int main() {
printf("우편번호 : %d\n", ZIP_CODE);
printf("전화번호 : %s\n", TEL);
PRINT_HELLO
}
🖥️ 실행 결과
우편번호 : 24582
전화번호 : 1234-5678
hello
⌨️ 예제 2
// 일반적인 함수 정의
#include <stdio.h>
int square(int a) {
return a * a;
}
int main() {
int a;
scanf("%d", &a);
}
한두 줄의 짧은 코드인 경우 함수로 정의하는 것보다 매크로 함수의 속도가 더 빠르며, 전달 인자의 자료형을 명시할 필요가 없는 장점이 있다.
// 매크로 함수 정의
#include <stdio.h>
#define SQUARE(X) X * X // 수식 "X * X"를 "SQUARE(X)"로 이름 붙여 정의
int square(int a) {
return a * a;
}
int main() {
int a;
scanf("%d", &a);
printf("%d\n", SQUARE(a)); // SQUARE(X)의 X 자리에 들어가서 "a * a"가 됨
}
🖥️ 실행 결과
5
25
⌨️ 예제 3
// 매크로 함수 정의 시 안수에 괄호 사용 여부
#include <stdio.h>
#define SQUARE1(X) X * X // 인수에 괄호 사용 안 함
#define SQUARE2(X) (X * X) // 인수 전체에 괄호 사용
#define SQUARE3(X) (X * X) // 인수 전체에만 괄호 사용
#define SQUARE4(X) ((X) * (X)) // 인수 전체와 각 인수에 괄호 사용
int square(int a) {
return a * a;
}
int main() {
int a = 5;
printf("%d\n", 100 / SQUARE1(a)); // "100 / a * a"이 되버림
printf("%d\n", 100 / SQUARE2(a)); // "100 / (a * a)"가 돼서 정상적으로 계산됨
printf("%d\n", SQUARE3(a - 1)); // "(a - 1 * a - 1)"이 되버림
printf("%d\n", SQUARE4(a - 1)); // "((a - 1) * (a - 1))"이 돼서 정상적으로 계산됨
}
🖥️ 실행 결과
100
4
-1
16
매크로는 단순 치환되기 때문에 원하지 않는 계산결과가 나올 수 있다. 따라서 모든 인수에 괄호를 치는 것이 가장 안전하다.
⌨️ 예제 4
// 인수가 2개인 매크로 함수
#include <stdio.h>
#define MAX(A, B) (((A) > (B)) ? (A) : (B)) // 조건 연산자를 매크로 함수로 정의
int main() {
int a = 5, b = 10;
printf("%d\n", MAX(a, b)); // a, b 중에서 최대값이 출력됨
}
🖥️ 실행 결과
10
⌨️ 예제 5
// 인수가 여러 개인 매크로 함수
#include <stdio.h>
#define FOR(I, S, E) for(int I = S; I <= E; I++) // for문 자체를 매크로 함수로 정의
int main() {
FOR(i, 1, 10) { // == for(int i = 1; i <= 10; i++)
printf("%d ", i);
}
printf("\n");
}
🖥️ 실행 결과
1 2 3 4 5 6 7 8 9 10