在C++中,我们可能会这样写:
#include <cassert.h>
#include <cstdio.h>
#include <cstdarg.h>
void func(..., short end = 0) {
// prevent caller from overriding default value with something other than null
assert(end == 0);
va_list args;
short x;
x = va_arg(args, short);
while (x != 0) {
printf("%d", va_arg(args, short));
}
va_end(list);
return;
}
但是,C 不支持默认函数参数。有没有什么办法可以强制 func
在其参数列表的末尾有一个尾随的空字符?有没有什么方法可以做到这一点,而无需程序员将终止 null 显式传递给函数?
我们不希望看到如下调用:
int x = 5;
float y = 6.4;
func(x, y, 0);
我们只需要 func(x, y);
。
是否可以编写一个宏来转换文本,如
func(x, y);
进入通话:
函数(x, y, 0);
?
有没有不用宏的方法?
最佳答案
您不能强制可变参数函数在 C 中具有特定的“最后”值。
参数列表中需要有一些东西告诉函数有多少参数。标准库中的一些示例:
printf
:格式字符串告诉函数有多少参数以及它们的类型。execl
:采用多个const char *
参数,最后一个参数必须为NULL
。
因此,在调用可变参数函数时将“标志”参数作为最后一个参数是 C 中已知的编程范例。这不是您需要掩盖的事情。
话虽这么说,你可以使用宏来做你想做的事:
#define FUNC(...) func(__VA_ARGS__, 0)
宏参数列表中的 ...
捕获所有参数,__VA_ARGS__
宏表示这些参数。
然后你可以这样定义func
:
void func(short first, ...)
然后像这样通过宏调用它
FUNC(x, y);
关于c - 在 C 中,我们如何强制可变参数函数中的最后一个参数为终止空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48426677/