00 개요
- 목적: '매크로'란 개념이 뭔지 정리하고자 함 - 컴퓨터 과학 및 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
}
참조
- (01 Macro란 1. 정의) https://en.wikipedia.org/wiki/Macro_(computer_science)
- (01 Macro란 2. C 언어에서의 Macro란) https://velog.io/@resister_boy/C언어-Macro에-대하여
- (02 Macro 정의하는 방법 1. #define 사용) https://velog.io/@wonder_land/C-15.-매크로-함수-인라인-함수
- (매크로 함수 - 장단점) https://www.tcpschool.com/c/c_prepro_macroFunc#google_vignette
'C' 카테고리의 다른 글
struct 구조체 (C언어 데이터 타입) (0) | 2024.08.09 |
---|---|
매크로 함수, 인라인 함수(#define, #inline) (0) | 2024.06.25 |
# 및 ## (C 언어 매크로 연산자) (0) | 2024.06.25 |
자료형 종류 (C 언어) (0) | 2024.06.24 |
Local vs Global Variable (지역 vs 전역 + static 변수) (0) | 2024.06.24 |