我有两个函数 foo1(a,b) & foo2(a,b,c) 和一个宏
#define add(a,b) foo(a,b)
我需要重新定义宏来完成,
1.如果 add() 被调用时带有 2 个参数,则调用 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
秒。可变参数函数需要一些关于实际参数数量的额外信息,因此这不是一个可行的解决方案,除非您在函数中指定被加数的数量。
附录:我已经更改了 add
宏,这样它就不会将空的可变参数列表传递给 ADD
。一些编译器允许空列表,但这不是标准的 C。
关于c - 宏中的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674663/