c - 宏内的变量参数

标签 c variables macros arguments

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

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

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

1.如果用2个参数调用add(),则调用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 s。可变参数函数需要一些关于实际参数数量的额外信息,所以这不是一个可行的解决方案,除非你在函数中指定被加数的数量。

附录:我更改了 add 宏,使其不会将空的可变参数列表传递给 ADD。一些编译器允许空列表,但它不是标准 C。

关于c - 宏内的变量参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674663/

相关文章:

c - 将 MPI Scatter 用于二维数组

c - 为什么 free() 会把东西留在内存中?

c - 结构数组末尾的空大括号 '{ }' 需要什么?

javascript - 在HTML文件中使用JavaScript chop 变量

c++ - 如何抑制源文件中特定宏定义的零参数的 GCC 可变参数宏参数警告

c - 奇数整数未正确加总

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

java - 我正在测试一个变量,我不断收到 android.widget.EditText@

c++ - 为项目文本文件定义宏

c++ - 错误 "not declared in the scope"但有接口(interface)