如果我调用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;
}
该程序会导致未定义的行为吗?
答案 0 :(得分:7)
您的程序 导致未定义的行为,但不是因为您使用va_arg
的方式。这只是忽略了额外的论点,所以包含它似乎浪费了打字。
导致未定义行为的原因是您未在该函数中包含va_end
。
来自规范( 7.15.1.1 va_arg
宏):
每次调用
va_arg
宏都会修改ap
,以便依次返回连续参数的值。 ......如果没有实际的下一个参数......行为是未定义的......
和 7.15.1.3 va_end
宏:
...如果在返回之前未调用
va_end
宏,则行为未定义。
没有提及必须拨打va_arg
一定次数。如您所见,va_end
很重要。
答案 1 :(得分:0)
va_arg
被定义为按照传递的顺序返回参数。如果你调用它的次数少于参数,你将简单地忽略任何额外的参数。