在C中,我们如何强制varargs函数中的最后一个参数为终止null?

Idl*_*ard 1 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,C不支持默认函数参数.有没有我可以强制func在其参数列表的末尾有一个尾随空字符?有没有办法在没有程序员明确地将终止空值传递给函数的情况下执行此操作?

我们不希望看到如下调用:

int   x = 5;
float y = 6.4;
func(x, y, 0);
Run Code Online (Sandbox Code Playgroud)

我们只是想要func(x, y);.

是否可以编写一个可以转换文本的宏

func(x, y);

进入电话:

func(x, y, 0);

有没有办法在没有宏的情况下做到这一点?

dbu*_*ush 6

您不能强制varargs函数在C中具有特定的"最后"值.

参数列表中需要有一些东西告诉函数有多少参数.标准库中的一些示例:

  • printf:格式字符串告诉函数有多少参数及其类型.
  • execl:需要一些const char *参数,最后一个必须是NULL.

因此,在调用varargs函数时,将一个"flag"参数作为最后一个是C中已知的编程范例.这不是你需要掩盖的东西.


话虽这么说,你可以使用宏来做你想要的:

#define FUNC(...) func(__VA_ARGS__, 0)
Run Code Online (Sandbox Code Playgroud)

...宏参数列表中捕获所有的参数,和__VA_ARGS__宏表示这些参数.

然后你可以这样定义func:

void func(short first, ...)
Run Code Online (Sandbox Code Playgroud)

并通过像这样的宏调用它

FUNC(x, y);
Run Code Online (Sandbox Code Playgroud)