매크로(Macro)는 특정 코드(자주 사용하는)를 하나의 명령어로 묶어 코드를 더 단순하고 간결하게 작성할 수 있도록 하는 문법입니다. 매크로를 사용할 경우 코드의 가독성을 높일 수 있을 뿐 아니라 매크로를 수정하면 소스 코드 전체에 수정된 내용이 반영되기 때문에 유지보수 측면에서도 효율적입니다.
매크로는 #define을 사용하여 정의하며 일반적으로 소스 코드의 제일 상단에 위치합니다. 이는 C 컴파일러가 소스 파일의 상단에서부터 컴파일하는데, 만일 매크로가 정의되기 이전에 사용될 경우 에러가 발생하기 때문입니다. 또한 매크로를 선언할 때는 보통 대문자로 선언하는데 이는 코드의 가독성 때문입니다. 매크로는 #define 이후 정의되는 명령어에 따라 매크로 상수와 매크로 함수로 구분되며, 매크로 상수와 매크로 함수는 아래와 같이 정의합니다.
// #define [매크로 상수명] [값]
#define AGE 22
#define NAME "Resister_boy"
#define WEIGHT 90
int main() {
printf("My Age is %d\n", AGE); // AGE는 전처리 과정에서 22로 치환
printf("My Name is %s\n", NAME); // NAME은 전처리 과정에서 Resister_boy로 치환
printf("My Weight is %d\n", WEIGHT); // WEIGHT은 전처리 과정에서 90으로 치환
return (0);
}
// #define [매크로 함수명[인자]] [명령어]
#include <stdio.h> // 매크로에서 표준함수를 사용하려면 해당 함수원형이 선언된 헤더파일을 선언해야 한다
#define PLUS(X) ((X)+(X))
#define MINUS(Y) ((Y)-(Y))
#define MULTIPLY(Z) ((Z)*(Z))
#define PRINTVALUE(X, Y, Z) printf("PLUS : %d\nMINUS : %d\nMULTIPLY : %d", X, Y, Z);
int main(void) {
int x = 1;
int y = 5;
int z = 10;
int _x;
int _y;
int _z;
_x = PLUS(x);
_y = MINUS(y);
_z = MULTIPLY(z);
PRINTVALUE(_x, _y, _z);
return (0);
}
매크로 함수의 역할 자체는 전역적으로 선언된 함수와 비슷하다고 할 수 있습니다. 매크로 함수는 컴파일러가 소스 코드를 컴파일 하기 이전에 전처리 과정에서 매크로로 선언된 값이 소스 코드에서 매크로가 사용된 위치로 치환된다는 차이가 있습니다. 매크로 함수가 컴파일 되기 이전 전처리 단계에서 치환된다는 것은 매크로 함수의 중요한 특징입니다. 이때 유의해야 할 점은 매크로 함수가 컴파일 이전에 미리 치환되는데, 때문에 매크로 함수를 사용할 때는 괄호()를 사용하여 함수와 모든 인자를 묶어주어야 합니다.
매크로 함수는 코드를 연산하는 것이 아니라 단순히 치환만 해주는 것이기 때문에 인수의 타입을 체크하지 않으며, 동시에 여러 개의 명령문을 포함할 수 있습니다. 또한 함수 호출에 의한 성능 저하가 일어나지 않기 때문에 실행속도가 향상된다는 장점이 있습니다. 다만, 복잡한 함수의 구현과 디버깅이 어려우며, 추상화된 계층이 하나 더 생겨나는 것이기 때문에 코드를 읽고 이해하기 까다롭다는 단점이 있습니다.
일반적으로 매크로를 정의할 때는 #define을 사용하지만, 조건에 따라 매크로를 선언할 수 있도록 하는 명령어도 있습니다. 이 경우 조건에 해당하지 않을 경우 매크로가 컴파일되지 않으며, 이는 소스 자체가 존재하지 않는 것과 같습니다. 이를 전처리 명령어라고 합니다.
#if 오른쪽 조건이 참일 경우 아래 명령어를 컴파일합니다
#if NUMBER <= 10
printf("%d\n", NUMBER) // NUMBER가 10이하일 때 NUMBER를 출력
#elif 오른쪽 조건이 참일 경우 아래 명령어를 컴파일합니다
#elif NUMBER >= 20
printf("%d\n", NUMBER) // NUMBER가 20이상일 때 NUMBER를 출력
#if 또는 #elif가 참이 아닐 경우 아래 명령어를 컴파일합니다
#else
printf("%d\n", NUMBER) // NUMBER가 11이상이고 20미만일 때 NUMBER를 출력
오른쪽 매크로 또는 파일이 정의되어 있을 경우 아래 명령어를 컴파일합니다
#ifdef NUMBER
printf("%d\n", NUMBER) // NUMBER가 정의되어 있을 경우 NUMBER를 출력
오른쪽 매크로 또는 파일이 정의되어 있지 않을 경우 아래 명령어를 컴파일합니다
#ifndef NUMBER
#define NUMBER 10 // NUMBER가 정의되어 있지 않을 경우 아래 NUMBER 10을 정의
조건부 매크로 정의 후 전처리 명령어가 끝났음을 정의하는 명령어입니다.
#endif
#undef 전처리 명령어를 통해 정의한 매크로를 해제할 수 있습니다.
#undef NUMBER // 정의된 매크로 NUMBER를 해제
코딩교육 TCP School
http://www.tcpschool.com/c/c_prepro_macroFunc
C전처리기 - 위키백과
https://ko.wikipedia.org/wiki/C_%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0