以下代码:
void fun(char *msg, int n, int m, ...) {
va_list ptr;
va_start(ptr, m); // Question regarding this line
printf("%d ", va_arg(ptr, int));
}
该函数调用如下:
fun("Hello", 3, 54, 1, 7);
我的问题是关于上面评论的那一行。我尝试了该行的以下三个版本:
va_start(ptr, msg);
va_start(ptr, n);
va_start(ptr, m);
在所有三种情况下,我得到“1”作为输出。 From what I have read,va_start
的第二个参数应该是函数fun()
的参数列表中的最后一个参数,即va_start(ptr, m);
应该是正确的调用。那么为什么我在这三种情况下得到相同的输出。
[我在Ideone上运行程序,如果有任何后果的话。]
答案 0 :(得分:10)
根据C标准,您显示的前两个调用是未定义的行为;只传递最后一个命名参数的调用是正确的。但是,你在gcc上获得了良好的行为,因为gcc编译器会忽略va_start
的第二个参数,使用不同的技术来查找参数列表的结尾:
传统的实现只接受一个参数,即存储参数指针的变量。
va_start
的ISO实现需要额外的第二个参数。用户应该在这里写出函数的最后一个命名参数。 但是,va_start
不应使用此参数。查找命名参数结尾的方法是使用下面描述的内置函数 {link}。