使用C中带有任意数量参数的函数的参数

Ref*_*ion 4 c parameters variadic-functions

我刚才读到:"C void arguments"关于C中这些函数定义之间的差异:

int f(void)
Run Code Online (Sandbox Code Playgroud)

int f()
Run Code Online (Sandbox Code Playgroud)

理解第二种形式意味着一个函数返回带有任意数量参数的整数,我想知道我们如何实际访问和使用这些未知参数

我很想得到示例代码和解释.

另外,我知道的可变参数的在C机构(与va_arg,va_end,va_start函数)和将高兴地听到这个机构和之间的差异f()的形式如上所述.

非常感谢!

lus*_*oog 7

第二个版本不NOT接受可变数量的参数,它接受的参数的固定(但不特定)序列.实际上,它声明了函数,但没有对函数进行原型化.因此,不会检查函数的调用是否为有效类型.编译器通常会查看对函数的第一次调用,并针对第一次调用中找到的类型检查其他调用.

这就是为什么,如果省略#include <stdio.h>,第一次调用printf将是可接受的,但是对printf不同类型的任何调用都将产生错误.例如.

int main() {
    printf("hello");        //<--- accepted, compiler may assume `int printf(char *);`
    printf("%s", "world");  //<--- error, type mismatch
}
Run Code Online (Sandbox Code Playgroud)

要让函数接受变量号,它必须至少有一个固定参数,然后是令牌....

int f (int first, ...);
Run Code Online (Sandbox Code Playgroud)

您需要包含stdarg.h头文件.该函数可以使用宏访问参数.

void f (int c,...){
    va_list ap;
    va_start(ap, c);
    for(;c--;)
        printf("%d", va_arg(ap,int));
    va_end (ap);
}
Run Code Online (Sandbox Code Playgroud)

将固定参数作为剩余参数的计数是很方便的.你还需要以某种方式确定每个参数的类型.在这个例子中,假设它们都是int.

  • 我会称之为*"固定(未指定)**序列**参数"*不是****参数(顺序显然很重要!). (3认同)