[C언어/C++] 매크로(define) 함수 사용법 & 예제

매크로 함수란?

매크로 함수는 함수처럼 인자를 설정할 수 있는 매크로를 의미합니다. 매크로 상수와는 달리 매크로 함수 이름에 괄호 와 함께 인자 목록이 주어져 있습니다. 매크로 함수라고 부르지만 단순히 치환하기만 하므로 실제로 함수는 아닙니다. 함수 선언과 비슷하지만 매크로 함수는 인자의 자료형을 신경 쓰지 않습니다. 즉, 자료형의 독립성을 보장합니다. 또 매크로 함수 내부에서 자기 자신을 호출할 수 없다는 특징이 있습니다. 매크로를 정의하는 경우에는 컴파일이 되면 해당 매크로 이름을 가진 것들이 지정해놓은 값으로 변해서 컴파일 됩니다.

 

 매크로 함수 사용법 

#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;
}

매크로 예제1

 

매크로 함수 사용시 주의점

#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;
}

매크로 예제2

매크로 함수는 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;
}

매크로 예제3

매크로 함수에서 전처리기 연산자인 #을 활용하면 매크로 함수의 인자를 문자열로 바꾸어줄 수 있습니다.

 

매크로 ##연산자

#include <stdio.h>

#define CONCAT(x,y,z) x ## y ## z

int main()
{
    printf("매크로 함수(CONCAT) : %d\n", CONCAT(10, 20, 30));
    
    return 0;
}

매크로 예제4

매크로 함수에서 전처리기 연산자인 ##(토큰 결합 연산자)을 활용하면 매크로 함수의 인자들을 이어붙일 수 있습니다.

 

매크로 함수와 인라인 함수의 공통점과 차이점

매크로 함수와 인라인 함수는 작동방식과 결과에 대해서는 매우 유사하지만 차이점도 있습니다.

 

inline 함수의 경우

  • 컴파일 단계(Compiling)에서 처리가 이루어집니다. (인라인 하느냐 vs 안되느냐)
  • 일반적인 함수들을 위해 실행하는 타입 검사가 그대로 적용됩니다.

 

macro 확장자의 경우 

  • 전처리 단계(Preprocessing)에서 치환이 이루어집니다.
  • 대치 시 어떠한 타입 검사도 이루어지지 않습니다.

[C언어/C++] 인라인(inline) 함수 사용법 & 예제

댓글

Designed by JB FACTORY