庞大的宏定义过载

Bulky macro definition overload

本文关键字:宏定义      更新时间:2023-10-16

我想定义像

这样的宏
#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等。但问题是,这些宏并不像我在例子中给出的那样原始,它们包含很多行代码,最好不要重写它们,而是只定义一个非平凡的宏,例如DECLARE_FUNCTION_WITH_1_ARG,并从所有其他宏的主体中调用它。

您可以在宏中拥有可变数量的参数。可以通过在宏中使用特殊符号(如__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)

这个特性被称为"可变宏"。