我想定义像
这样的宏#define DECLARE_FUNCTION(funcName, retType, args) retType funcName(args)
并像
一样使用它DECLARE_FUNCTION(intFunc, int, void);
DECLARE_FUNCTION(voidFunc, void, double, double);
DECLARE_FUNCTION(doubleFunc, double, int, double, double);
期望那些会扩展到
int intFunc(void);
void voidFunc(double, double);
double doubleFunc(int, double, double);
这肯定不起作用,因为用三个参数定义的宏会占用所有“冗余”参数,结果是
int intFunc(void);
void voidFunc(double);
double doubleFunc(int);
我不介意为不同的情况定义宏,比如
DECLARE_FUNCTION_WITH_0_ARGS
,DECLARE_FUNCTION_WITH_1_ARG
,DECLARE_FUNCTION_WITH_2_ARGS
等等。但问题是这些宏不像我在示例中给出的那样原始,它们包含很多行代码,它会很高兴不重写它们,但只定义一个非平凡的宏,eq DECLARE_FUNCTION_WITH_1_ARG
,并从所有其他宏的主体中调用它。
答案 0 :(得分:6)
您的宏中可以包含可变数量的参数。可以使用宏中的__VA_ARGS__
之类的特殊符号来访问它们。
这是标准C中的语法。
#define DECLARE_FUNCTION(funcName, retType, ...) retType funcName(__VA_ARGS__)
...
代表所有动态参数,由__VA_ARGS__
访问。请注意,您至少需要一个动态参数,否则会出现编译器错误。
GNU C ++引入了扩展来防止这种情况发生。所以你也可以将上面声明为:
#define DECLARE_FUNCTION(funcName, retType, ...) retType funcName(##__VA_ARGS__)
以下是一些例子:
DECLARE_FUNCTION(func1, void)
变为void func1()
(仅限扩展名)。
DECLARE_FUNCTION(func2, int, int, char)
变为int func2(int, char)
此功能称为"可变参数宏"。您可以阅读更多here。