宏内的变量参数

Sru*_*thy 0 c variables macros arguments

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

#define add(a,b) foo(a,b)
Run Code Online (Sandbox Code Playgroud)

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

1.如果使用2个参数调用add(),则调用foo1

  1. 如果使用 3 个参数调用 add() 则调用 foo2

我对 VA_ARGS 选项不熟悉。我怎样才能做到这一点

M O*_*ehm 5

如果您只想区分两个函数,可以使用以下方法:

#define ADD(_1, _2, _3, X, ...) X
#define add(...) ADD(__VA_ARGS__, add3, add2, 0)(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

辅助宏ADD总是选择第四个参数:

add(a, b)    --> ADD(a, b, add3, add2, 0)    --> add2
add(a, b, c) --> ADD(a, b, c, add3, add2, 0) --> add3
Run Code Online (Sandbox Code Playgroud)

缺点是,当您不向函数提供两个或三个参数时,您会收到相当神秘的错误消息。

相对于可变参数函数的优点是可以获得类型安全。例如,如果您的函数对doubles 进行操作,您仍然可以说add(1, 2)整数参数将转换为doubles。可变参数函数需要一些有关实际参数数量的附加信息,因此这不是一个可行的解决方案,除非您在函数中指定被加数的数量。

附录:我已经更改了add宏,以便它不会将空的变量列表传递给ADD. 有些编译器允许空列表,但它不是标准 C。

  • 我必须说,你的比我的更具可读性。确定+1 (2认同)