gpt4 book ai didi

c++ - 庞大的宏定义重载

转载 作者:太空狗 更新时间:2023-10-29 20:25:27 25 4
gpt4 key购买 nike

我想定义宏

#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 等。但问题是这些宏并不像我在示例中给出的那样原始,它们包含一个很多行代码,最好不要重写它们,而是只定义一个重要的宏,e.q. 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)

此功能称为“可变参数宏”。您可以阅读更多 here .

关于c++ - 庞大的宏定义重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com