[C언어/C++] 매크로(define) 함수 사용법 & 예제
- Language/C , C++ , C#
- 2021. 2. 22.
매크로 함수란?
매크로 함수는 함수처럼 인자를 설정할 수 있는 매크로를 의미합니다. 매크로 상수와는 달리 매크로 함수 이름에 괄호 와 함께 인자 목록이 주어져 있습니다. 매크로 함수라고 부르지만 단순히 치환하기만 하므로 실제로 함수는 아닙니다. 함수 선언과 비슷하지만 매크로 함수는 인자의 자료형을 신경 쓰지 않습니다. 즉, 자료형의 독립성을 보장합니다. 또 매크로 함수 내부에서 자기 자신을 호출할 수 없다는 특징이 있습니다. 매크로를 정의하는 경우에는 컴파일이 되면 해당 매크로 이름을 가진 것들이 지정해놓은 값으로 변해서 컴파일 됩니다.
매크로 함수 사용법
#define (매크로 함수 이름) (매크로 함수 기능)
#define ADD(a,b) a+b //ex
#define으로 시작되는 전처리 문장을 매크로라고 하며 이를 사용하여 매크로 함수를 만들 수 있습니다.
매크로 함수 사용 예제
#include <stdio.h>
#define ADD(x,y) x+y
int main()
{
int num1 = 10;
int num2 = 20;
printf("매크로 함수(ADD) : %d + %d = %d\n", num1, num2, ADD(num1, num2));
return 0;
}
매크로 함수 사용시 주의점
#include <stdio.h>
#define MUL1(x,y) x*y
#define MUL2(x,y) (x)*(y)
int main()
{
int num1 = 5;
int num2 = 4;
printf("매크로 함수(MUL1) : %d * %d = %d\n", num1 + 1, num2 + 1, MUL1(num1 + 1, num2 + 1)); // num1 + 1 * num2 + 1로 변환
printf("매크로 함수(MUL2) : %d * %d = %d\n", num1 + 1, num2 + 1, MUL2(num1 + 1, num2 + 1)); // (num1 + 1) * (num2 + 1)로 변환
return 0;
}
매크로 함수는 num1+1, num2+2를 단순히 x와 y의 위치에서 단순히 치환하기 때문에 괄호를 제대로 사용하지 않는다면 위와 같은 문제점이 발생할 수 있습니다. 곱셈처럼 연산순서에 따라 결과가 달라질 수 있다면 어떠한 인자값이 들어올 지 모르니 매크로 함수의 기능에 명시적으로 괄호를 처리해주어 잘못 연산되는것을 방지해주도록 합시다.
매크로 #연산자
#include <stdio.h>
#define ADD1(x,y) x + y
#define ADD2(x,y) #x "+" #y //문자열로 바꿔주는 연산자 #
int main()
{
printf("매크로 함수(ADD1) : %d\n", ADD1(10, 20));
printf("매크로 함수(ADD2) : %s\n", ADD2(10, 20));
return 0;
}
매크로 함수에서 전처리기 연산자인 #을 활용하면 매크로 함수의 인자를 문자열로 바꾸어줄 수 있습니다.
매크로 ##연산자
#include <stdio.h>
#define CONCAT(x,y,z) x ## y ## z
int main()
{
printf("매크로 함수(CONCAT) : %d\n", CONCAT(10, 20, 30));
return 0;
}
매크로 함수에서 전처리기 연산자인 ##(토큰 결합 연산자)을 활용하면 매크로 함수의 인자들을 이어붙일 수 있습니다.
매크로 함수와 인라인 함수의 공통점과 차이점
매크로 함수와 인라인 함수는 작동방식과 결과에 대해서는 매우 유사하지만 차이점도 있습니다.
inline 함수의 경우
- 컴파일 단계(Compiling)에서 처리가 이루어집니다. (인라인 하느냐 vs 안되느냐)
- 일반적인 함수들을 위해 실행하는 타입 검사가 그대로 적용됩니다.
macro 확장자의 경우
- 전처리 단계(Preprocessing)에서 치환이 이루어집니다.
- 대치 시 어떠한 타입 검사도 이루어지지 않습니다.
'Language > C , C++ , C#' 카테고리의 다른 글
[C++] 클래스(Class) 사용법 & 예제 총정리 (5) | 2021.02.23 |
---|---|
[C++] 템플릿(template) 사용법 & 예제 총정리 (1) | 2021.02.23 |
[C언어/C++] 인라인(inline) 함수 사용법 & 예제 (0) | 2021.02.22 |
[C언어/C++] 화면 깜빡임 없애기 (더블 버퍼링) (0) | 2021.02.21 |