庞大的宏定义超载

Ale*_* B. 3 c c++ macros

我想定义宏像

#define DECLARE_FUNCTION(funcName, retType, args) retType funcName(args)
Run Code Online (Sandbox Code Playgroud)

并使用它

DECLARE_FUNCTION(intFunc, int, void);
DECLARE_FUNCTION(voidFunc, void, double, double);
DECLARE_FUNCTION(doubleFunc, double, int, double, double);
Run Code Online (Sandbox Code Playgroud)

期待那些将扩展到

int intFunc(void);
void voidFunc(double, double);
double doubleFunc(int, double, double);
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为用三个参数定义的宏会占用所有"冗余"参数,结果是

int intFunc(void);
void voidFunc(double);
double doubleFunc(int);
Run Code Online (Sandbox Code Playgroud)

我不介意定义不同的情况下宏,像 DECLARE_FUNCTION_WITH_0_ARGS,DECLARE_FUNCTION_WITH_1_ARG,DECLARE_FUNCTION_WITH_2_ARGS等等.但问题是,这些宏并不像我在本例中得到以原始的,它们包含了很多行代码,这将是很好的不重写它们,但只定义一个非平凡的宏,eq DECLARE_FUNCTION_WITH_1_ARG,并从所​​有其他宏的实体中调用它.

met*_*bed 6

您可以在宏中拥有可变数量的参数.可以使用__VA_ARGS__宏内部的特殊符号访问它们.

这是标准C中的语法.

#define DECLARE_FUNCTION(funcName, retType, ...) retType funcName(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

...所有动态参数和看台上被访问__VA_ARGS__.请注意,您至少需要一个动态参数,否则会出现编译器错误.

GNU C++引入了扩展来防止这种情况发生.所以您也可以将上述内容声明为:

#define DECLARE_FUNCTION(funcName, retType, ...) retType funcName(##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

这里有些例子:

DECLARE_FUNCTION(func1, void)成为void func1()(仅限扩展名).

DECLARE_FUNCTION(func2, int, int, char)int func2(int, char)

此功能称为"可变参数宏".你可以在这里阅读更多.