[C, C++] 가변인자를 가지는 매크로(define) 구현

가변인자만을 가지는 매크로 구현

테스트환경 : Windows10 / Visual Studio Code / gcc 6.3.0

함수에 가변인자를 사용할 수 있듯이 매크로에도 가변인자를 사용할 수 있다.

[C, C++] 가변인자를 가지는 함수 구현

가변인자만을 가질 때와 가변인자와 고정인자를 같이 가질 때 매크로 구현법이 다른데, 먼저 가변인자만을 가지는 매크로 구현은 아래와 같다.

#include<stdio.h>

#define PRINT(...) printf(__VA_ARGS__)

int main(){
    PRINT("print\n"); // output : print
    PRINT("%d %d\n", 1, 2); // output : 1 2
    PRINT("%d %d %d\n", 1, 2, 3); // output : 1 2 3
}

(…)는 가변인자임을 표시하며 __VA_ARGS__는 가변인자를 입력받는다.

가변인자와 고정인자를 가지는 매크로 구현

매크로를 정의할 때 고정인자와 가변인자를 둘 다 사용하도록 했는데 가변인자를 사용하지 않는다면 컴파일 에러가 발생한다.

#include<stdio.h>

#define PRINT2(fixVar, ...) printf(fixVar, __VA_ARGS__)  // If there is no variadic var, occurs error 

int main(){
    PRINT2("print\n"); // error
    PRINT2("%d %d\n", 1, 2);
    PRINT2("%d %d %d\n", 1, 2, 3);
}

고정인자와 같이 쓰기 위해서는 __VA_ARGS__ 대신 ##__VA_ARGS__를 써야 한다.

#include<stdio.h>

#define PRINT2(fixVar, ...) printf(fixVar, ##__VA_ARGS__) 

int main(){
    PRINT2("print\n"); // output : print
    PRINT2("%d %d\n", 1, 2); // output : 1 2
    PRINT2("%d %d %d\n", 1, 2, 3); // output : 1 2 3
}

가변인자만 사용할 때는 ##__VA_ARGS__가 아닌 __VA_ARGS__ 를 사용해야 컴파일 에러가 발생하지 않는다.그런데 굳이 고정인자를 넣어야 하는 필요성을 못 느끼겠다. __VA_ARGS__만 사용하면 되지 않나 싶다.

Leave a Comment