我有两个宏FOO2FOO3:

#define FOO2(x,y) ...
#define FOO3(x,y,z) ...

我想定义一个新的宏FOO,如下所示:

#define FOO(x,y) FOO2(x,y)
#define FOO(x,y,z) FOO3(x,y,z)

但这不起作用,因为宏不会在参数数量上过载.

在不修改FOO2FOO3的情况下,有没有办法定义一个宏FOO(使用__VA_ARGS__或其他方式),以获得调度FOO(x,y)FOO2FOO(x,y,z)FOO3的相同效果?

推荐答案

简单到:

#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)

因此,如果您有这些宏,它们将按所述方式展开:

FOO(World, !)         // expands to FOO2(World, !)
FOO(foo,bar,baz)      // expands to FOO3(foo,bar,baz)

如果你想要第四个:

#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO4, FOO3, FOO2)(__VA_ARGS__)

FOO(a,b,c,d)          // expands to FOO4(a,b,c,d)

当然,如果定义FOO2FOO3FOO4,输出将被定义的宏的输出所取代.

C++相关问答推荐

执行自动聚焦规则后的CLIPS聚焦模块

海湾合作委员会是否保证大小匹配的访问?

函数指针始终为零,但在解除引用和调用时有效

CC crate 示例不会与C函数链接

位屏蔽对于无符号转换是强制的吗?

为什么在C中二维字符数组会有这样的行为?

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

如何在GDB中查看MUSL的源代码

C语言中的数字指针

将回调/基于事件的C API转换为非回调API

运行时错误:在索引数组时加载类型为';char';`的空指针

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

从另一个宏函数调用C宏

在吉陀罗中,_2_1_和CONCAT11是什么意思?

当用C打印过多的';\n';时输出不正确

在git补丁中自动添加C的宏

从文件到链表读取日期

计算时出现奇怪的计算错误;N Select K;在C中

在哪里可以找到叮当返回码的含义?

'printf("%s", user_input)' 危险吗?