我有两个函数 foo1(a,b) & foo2(a,b,c) 和一个宏
#define add(a,b) foo(a,b)
我需要重新定义宏来完成,
1.如果用2个参数调用add(),则调用foo1
- 如果使用 3 个参数调用 add(),则调用 foo2
我是选项 VA_ARGS 的新手。我该怎么做呢
最佳答案
如果你只是想区分两个功能,下面的工作:
#define ADD(_1, _2, _3, X, ...) X
#define add(...) ADD(__VA_ARGS__, add3, add2, 0)(__VA_ARGS__)
辅助宏ADD
总是选择第四个参数:
add(a, b) --> ADD(a, b, add3, add2, 0) --> add2
add(a, b, c) --> ADD(a, b, c, add3, add2, 0) --> add3
缺点是当您不向函数提供两个或三个参数时,您会收到非常神秘的错误消息。
与可变参数函数相比,优势在于您获得了类型安全性。例如,如果你的函数在 double
上运行,你仍然可以说 add(1, 2)
并且整数参数将被转换为 double
s。可变参数函数需要一些关于实际参数数量的额外信息,所以这不是一个可行的解决方案,除非你在函数中指定被加数的数量。
附录:我更改了 add
宏,使其不会将空的可变参数列表传递给 ADD
。一些编译器允许空列表,但它不是标准 C。
关于c - 宏内的变量参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674663/