c - 宏中的可变参数

标签 c variables macros arguments

我有两个函数 foo1(a,b) & foo2(a,b,c) 和一个宏

#define add(a,b) foo(a,b)

我需要重新定义宏来完成,

1.如果 add() 被调用时带有 2 个参数,则调用 foo1

  1. 如果使用 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/

相关文章:

c++ - 为什么我不能如下设置接口(interface)类的成员变量

javascript - 在js函数中定义一个变量然后在函数外使用它?

c++ 从宏到模板

c - 即使函数带有参数,也会对函数原型(prototype)发出警告

c++ - 类似Python的 "if x in y"for C/C++的操作?

c - 为什么recvfrom()返回错误的发送者地址?

r - 使用路径变量在 R markdown 中插入图像

C 宏定义可变长度值

c - 编写一个检查字符是否为字母的宏

C Linux 内核页面干扰先前的变量