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()的形式如上所述.
非常感谢!
第二个版本不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.