C:未指定数量的参数 - void foo()

Jac*_*ieg 10 c function variadic-functions

在这里读到的是C void foo()手段a function foo taking an unspecified number of arguments of unspecified type.

任何人都可以给我或指向一个C函数采用未指定数量的参数的示例吗?这适用于C什么?我在网上找不到任何东西.

谢谢!

Kei*_*son 18

这是一个旧式的函数声明.

本声明:

void foo();
Run Code Online (Sandbox Code Playgroud)

声明这foo是一个返回的函数void,它接受一个未指定但固定的数字和类型的参数.这并不意味着具有任意参数的调用是有效的; 这意味着编译器无法使用错误的数字或类型的参数来诊断错误的调用.

某处,也许在另一个翻译单元(源文件)中,必须有一个函数的定义,也许:

void foo(x, y)
long x;
double *y;
{
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

这意味着,任何调用foo通过类型的两个参数long,并double*是无效的,并已未定义行为.

在1989 ANSI C标准之前,这些是该语言中唯一可用的函数声明和定义,编写正确函数调用的负担完全取决于程序员.ANSI C添加了原型,函数声明指定了函数参数的类型,允许对函数调用进行编译时检查.(这个特性是从早期的C++中借来的.)现代的等价物是:

void foo(long x, double *y);

/* ... */

void foo(long x, double *y) {
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

旧式(非原型)声明和定义仍然是合法的,但它们已经正式淘汰,这意味着原则上它们可以从该语言的未来版本中删除 - 尽管它们仍然存在于2011年标准我不知道那将会真正发生.

没有充分的理由在现代C代码中使用旧式函数声明和定义.(我已经看到在一些极端情况下使用它们的论点,但我觉得它们不能令人信服.)

C还支持可变参数函数printf,它们可以采用任意数量的参数,但这是一个独特的特性.必须使用包含尾随的原型声明可变参数函数, ....(调用没有可见原型的可变函数不是非法的,但它具有未定义的行为.)函数本身使用定义的宏<stdarg.h>来处理其参数.与旧式函数声明一样,对于与之对应的参数没有编译时检查, ...(尽管某些编译器可能会检查某些调用;例如,如果printf调用中的参数与格式字符串不一致,则gcc会发出警告).

  • @JasonSwartz:旧式非原型声明是*过时的*语言特性,它们不能用于编写可以接受2或3个参数的函数.除非你需要处理使用它们的旧代码,否则只是假装它们不存在并且总是使用原型. (3认同)
  • @giorgi:`void someFunc();`是一个*旧式*非原型函数声明。它没有指定参数的数量或类型。同样,`void someFunc(){/ * ... * /}`是旧式的定义;它指定没有参数,但不对调用方强制执行。旧式的声明和定义是“过时的”,但是语言标准仍然完全支持它。传递正确数量和类型的参数(在这种情况下为无)的调用具有明确定义的行为。参数不正确的调用(如someFunc(42,“ Oops!”)`)具有未定义的行为。 (2认同)