가변인자만을 가지는 매크로 구현
테스트환경 : Windows10 / Visual Studio Code / gcc 6.3.0
함수에 가변인자를 사용할 수 있듯이 매크로에도 가변인자를 사용할 수 있다.
가변인자만을 가질 때와 가변인자와 고정인자를 같이 가질 때 매크로 구현법이 다른데, 먼저 가변인자만을 가지는 매크로 구현은 아래와 같다.
#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__만 사용하면 되지 않나 싶다.