c - 在 C 中,我们如何强制可变参数函数中的最后一个参数为终止空值?

标签 c function variadic-functions default-arguments

在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/

相关文章:

c - 在多个 fork 进程之间共享错误

javascript - C++ 中的 unsigned short * 和 wchar_t 错误

java - 从字符串到整数函数

Go:可变参数函数和太多参数?

c++ - 我怎么会 'generate variadic parameters'?

c - 最佳无限循环

python - 对 Py_Initialize() 的 undefined reference

C:警告: ‘withdrawal_amt’ 可能在此函数中未初始化地使用

python 在列表中查找不同的元素

java - 在 Java 中使用 Streams 和过滤器并与 varargs 匹配