1

如果我调用va_arg的次数少于可变参数函数中传递的参数数量,这是未定义的行为吗?

例如:

#include <stdarg.h>
void foo(unsigned n, ...) {
    va_list ap;
    int bar = 0;

    va_start(ap, n);
    if (n) bar = va_arg(ap,int);
    // Do something with bar
}

int main() {
    foo(2, 3, 4);
    return 0;
}

该程序会导致未定义的行为吗?

4

2 回答 2

7

您的程序确实会导致未定义的行为,但不是因为您使用va_arg. 这只是忽略了额外的参数,因此包含它似乎是浪费打字。

导致未定义行为的原因是您没有包含va_end在该函数中。

从规范(7.15.1.1va_arg):

va_arg宏的每次调用都会修改ap,以便依次返回连续参数的值。...如果没有实际的下一个参数...行为未定义...

并从7.15.1.3va_end

...如果在va_end返回之前未调用宏,则行为未定义。

没有提到必须调用va_arg一定次数。如您所见va_end,尽管如此,这很重要。

于 2012-10-15T06:35:45.113 回答
0

va_arg被定义为按照传递的顺序返回参数。如果您调用它的次数少于参数,您将简单地忽略任何额外的参数。

于 2012-10-15T06:36:47.200 回答