繁体   English   中英

庞大的宏定义超载

[英]Bulky macro definition overload

我想定义宏像

#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_ARGSDECLARE_FUNCTION_WITH_1_ARGDECLARE_FUNCTION_WITH_2_ARGS等。但问题是这些宏不像我在示例中给出的那样原始,它们包含很多行代码,它会很高兴不重写它们,但只定义一个非平凡的宏,eq DECLARE_FUNCTION_WITH_1_ARG ,并从所​​有其他宏的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)

此功能称为“可变参数宏”。 你可以在这里阅读更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM