当您不想传递任何变量时,是否可以在C变量长度自变量函数中使用带格的情况?

时间:2019-05-12 12:52:23

标签: c

我想用可变长度参数在C中创建一个函数,在该函数中我可能不希望在任何时候传递任何变量。我在C中有这样的可能吗?如果可能的话,我想要一些代码片段。另外,我不得不提到的是,当传递一些变量时,该函数将仅传递char *变量。

5 个答案:

答案 0 :(得分:1)

标准C不支持。

对于以省略号结尾的功能参数类型列表,必须至少有一个命名参数。

对于使用标识符列表定义的函数,调用中的参数数量必须与定义中的参数数量匹配;不支持不同数量的参数。

如果您要调用带有不同数量char *自变量的函数,并且该数量可能为零,则可以使用始终传递但从未使用过的虚拟第一个自变量声明该函数,例如: / p>

void foo(int dummy,...);

请注意,不传递任何参数是一个麻烦的设计。通常,接受不同数量参数的例程从一个或多个参数推断参数的数量。例如,第一个参数可能包含剩余参数的数量,也可能是格式字符串(与printf一样),可以从中推导出剩余参数的数量和类型。如果您希望函数在某些情况下接受零参数,则它必须有一种方法来知道它是否被零参数或更多参数调用。那将需要处于某种全局状态的信息,这通常是一个错误的设计。

答案 1 :(得分:1)

不,你不能

您至少需要一个已知的论点

void foo(int dummy, ...)
{
va_list ap;

答案 2 :(得分:1)

具有可变参数的函数必须至少具有一个names参数,才能读取其他参数。

对于您的特定情况,由于要传递char *参数列表,因此可以使用NULL表示参数列表的末尾。因此,在没有任何要传递的情况下,您只需传递一个单NULL参数。

答案 3 :(得分:0)

C没有提供任何机制来允许被调用函数确定提供了多少个参数。该机制必须是调用接口的一部分。

例如,printf依赖于%格式规范,而execv要求调用者将空指针作为最后一个参数。

可以在不使用变量参数的情况下调用varargs函数,但是在这种情况下,调用方不得尝试访问任何变量参数。例如,仅在创建新文件的情况下才查询Posix open()函数的mode参数,因此如果flags参数不包含该文件,则无需提供该文件。 O_CREAT标志(或其他扩展名标志,例如Linux中的O_TMPFILE,它要求创建文件)。

原型的可变长度部分必须至少跟随一个固定参数。因此,根本不可能不带任何参数地调用varargs函数。

答案 4 :(得分:0)

  

您是否可以在C语言中使用变长参数函数来处理不希望传递任何变量的情况?

是的。在现代C语言中,代码不能定义一个没有参数的...函数,但是您可以通过声明一个没有函数签名的函数来调用没有参数的函数。这样,可以使用零参数调用该函数。


该函数仍然需要某种方式来理解参数的数量。通常,这是通过将第一个参数作为计数(或 format )或最后一个参数作为前哨来完成的。

鉴于“只会通过char*” ...

int foo_count(int counter, ...);    
// zero usage example
foo_count(0);    

int foo_sentinel(char *s);    
// zero usage example
foo_sentinel((char*) NULL);    

要通过传递 no 参数来执行此操作,则需要以其他方式(可能不使用全局变量)来传递计数-尽管不建议这样做。 (最好只是通过计数。)

声明功能:

int foo_count;
int foo(); // no prototype

呼叫函数

foo_count = 0; foo()
foo_count = 1; foo("one")
foo_count = 2; foo("one", "two")

定义函数

int foo(char *s1, ...) {
  if (foo_count > 0) {
    va_list ap;
    va_start(ap, s1);
    puts(s1);
    for (int i=1; i < foo_count; i++) {
      puts(va_arg(ap, char *));
    }
    va_end(ap);
  }
}