" va_start"的第二个论点

时间:2014-07-18 12:23:26

标签: c++ c variadic-functions

以下代码:

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 readva_start的第二个参数应该是函数fun()的参数列表中的最后一个参数,即va_start(ptr, m);应该是正确的调用。那么为什么我在这三种情况下得到相同的输出。

[我在Ideone上运行程序,如果有任何后果的话。]

1 个答案:

答案 0 :(得分:10)

根据C标准,您显示的前两个调用是未定义的行为;只传递最后一个命名参数的调用是正确的。但是,你在gcc上获得了良好的行为,因为gcc编译器会忽略va_start的第二个参数,使用不同的技术来查找参数列表的结尾:

  

传统的实现只接受一个参数,即存储参数指针的变量。 va_start的ISO实现需要额外的第二个参数。用户应该在这里写出函数的最后一个命名参数。 但是,va_start不应使用此参数。查找命名参数结尾的方法是使用下面描述的内置函数 {link}