목적: '매크로'란 개념이 뭔지 정리하고자 함 - 컴퓨터 과학 및 C 언어에서의 매크로 개념
C 언어에서의 개념에 더 집중
01 Macro란
1. 정의 - in Computer Science
'macro'
컴퓨터 과학에서 매크로는 정해진 순서에 따라 특정한 입력이 특정한 출력으로 매핑되어야 하는지를 정의하는 규칙 또는 패턴을 의미
하나의 매크로를 특정한 출력 시퀀스로 바로 만들어내는 매핑 과정을 "매크로 확장" (macro expansion) 이라고 함
입력과 출력은 may be a sequence of lexical tokens or characters, or a syntax tree
Character macros are supported in software applications to make it easy to invoke common command sequences.
Token and tree macros are supported in some programming languages to enable code reuse or to extend the language, sometimes for domain-specific languages
2. 정의 - in C 언어
매크로(Macro)는 특정 코드(자주 사용하는)를 하나의 명령어로 묶어 코드를 더 단순하고 간결하게 작성할 수 있도록 하는 문법
매크로 사용 시 코드의 가독성을 높일 수 있을 뿐 아니라 매크로를 수정하면 소스 코드 전체에 수정된 내용이 반영되기 때문에 유지보수 측면에서도 효율적
02 Macro 정의하는 법
1. #define 사용
#define 사용하여 정의하며 일반적으로 소스 코드의 제일 상단에 위치함
이유: 이는 C 컴파일러가 소스 파일의 상단에서부터 컴파일하는데, 만일 매크로가 정의되기 이전에 사용될 경우 에러가 발생하기 때문
또한 매크로를 선언할 때는 보통 대문자로 선언하는데 이는 코드의 가독성 때문
매크로는 #define 이후 정의되는 명령어에 따라 매크로 상수와 매크로 함수로 구분됨
NOTE: 매크로는 단순히 '치환'만 함
1) 매크로 상수
#include <stdio.h>
// #define 매크로상수명 값
#define AGE 22
#define NAME "Pearl"
main() {
printf("My age is %d\n", AGE); // AGE는 전처리 과정에서 22로 치환됨
printf("My name is %s\n", NAME); // NAME은 전처리 과정에서 Pearl로 치환됨
}
2) 매크로 함수
#include <stdio.h> // printf() 사용
// #define 매크로함수명(인자) 명령어
#define MY_PLUS(A, B) ((A)+(B))
#define MY_MINUS(A, B) ((A)-(B))
#define MY_MULTIPLY(A, B) ((A)*(B))
#define MY_PRINTVALUE(X, Y, Z) printf("PLUS: %d\nMINUS: %d\nMULTIPLY: %d", X, Y, Z);
main() {
int A = 7;
int B = 3;
int _x;
int _y;
int _z;
_x = MY_PLUS(A, B);
_y = MY_MINUS(A, B);
_z = MY_MULTIPLY(A, B);
MY_PRINTVALUE(_x, _y, _z);
}
장점
매크로 함수는 단순 치환만을 해주므로, 인수의 타입을 안 신경씀
매크로 함수를 사용하면 여러 개의 명령문을 동시에 포함 가능
함수 호출에 의한 성능 저하가 일어나지 않으므로, 프로그램의 실행속도가 향상됨
단점
원하는 결과를 얻는 정확한 매크로 함수의 구현은 어려우며, 따라서 디버깅 또한 매우 어려움
매크로 함수의 크기가 증가하면 사용되는 괄호 또한 매우 많아져서 가독성 떨어짐
03 Macro 정의 해제
1. #undef 사용
#include <stdio.h>
main() {
#define NUMBER 10
printf("1st round:\n");
#ifdef NUMBER
printf("NUMBER is defined as %d\n", NUMBER);
#endif
#ifndef NUMBER
printf("NUMBER is not defined.\n");
#endif
#undef NUMBER
printf("2nd round:\n");
#ifdef NUMBER
printf("NUMBER is defined as %d\n", NUMBER);
#endif
#ifndef NUMBER
printf("NUMBER is not defined.\n");
#endif
}