va_arg() 是在 stdarg.h 头文件中定义的**宏**。这个**宏**有助于从函数的参数列表中获取带类型的下一个参数。但该函数无法确定检索到的参数是否为最后一个参数。
type va_arg(va_list ap, type); #where ap is the object of va_list
va_arg() 函数接受两个参数。参数 'ap' 包含检索带有状态的额外参数所需的信息。在 va_start 的初始调用和 va_arg 的第一次调用之前,此 'ap' 对象被初始化。
| 参数 | 描述 | 必需/可选 |
|---|---|---|
| ap | va_list 的对象,它将保存信息 | 必需 |
| type | 类型名称用作表达式的类型,此宏扩展为 | 必需 |
宏 va_arg() 返回带有表达式类型的下一个参数列表。我们可以多次调用 va_arg 宏从列表中检索参数。
| 输入 | 返回值 |
|---|---|
| 如果参数 | 下一个参数列表 |
#include <stdio.h>
#include <stdarg.h>
int getsum(int, ...);
int main () {
printf("Sum of 23 and 45 is %d\n", getsum(2, 23, 45) );
return 0;
}
int getsum(int num_args, ...) {
int value = 0;
va_list ap;
int i;
va_start(ap, num_args);
for(i = 0; i < num_args; i++) {
value += va_arg(ap, int);
}
va_end(ap);
return value;
}
输出
Sum of 23 and 45 is 68
#include <stdio.h>
#include <stdarg.h>
void runcode (int i, ...)
{
va_list pntr;
va_start(pntr, i);
if (i == 0)
{
int n = va_arg(pntr, int);
printf("%d\n", n);
}
else
{
char *s = va_arg(pntr, char*);
printf("%s\n", s);
}
va_end(pntr);
}
int main()
{
runcode(0, 0xFFFFFFFF); // 0xffffffff is not an int
runcode(1, NULL); // NULL is not a char*
}
输出
-1 (null)