庞大的宏定义过载
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)
这个特性被称为"可变宏"。
相关文章:
- C++宏定义和取消定义
- 根据 c++ 标准在该宏定义中推送/弹出宏时的行为是什么
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 宏定义不正确没有错误
- Visual Studio:snprintf 冲突的宏定义
- 宏定义中的预处理器令牌两边有两个双引号
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 宏C++#定义示例(对象)(::f(s,(对象),arg1,arg2,arg3)
- 根据模板参数选择宏定义
- 使用宏定义打印格式参数
- 组合宏定义以一次获得多个定义 [avr C++]
- 如何在可执行文件中查看宏定义值
- 是否有另一种方法可以在不使用宏定义的情况下进行此操作
- 如何理解宏定义
- 坚持理解以下宏定义
- 发布C++宏定义
- 通过生成文件预处理器宏定义在 c++ 中无法正常工作
- 将预处理器宏定义为宏定义线
- GCC是否支持宏定义中的多行原始字符串文字
- 无法将宏定义传递给基类