#C 语言标准库函数 va_arg
/*********************************************
* @brief 从可变参数列表中读取下一个参数
* @param args 要读取的可变参数列表
* @param T 要读取参数的类型
********************************************/
T va_arg(va_list args, T);
说明
从可变参数列表 args
中读取下一个参数。
当实参传递给可变参数时,会进行默认实参提升:
- 所有字节少于
int
的整数类型(包括char
,signed char
,unsigned char
,short
,_Bool
) 都会被提升为int
或unsigned int
- 所有字节少于
double
的的浮点类型(包括float
)都会被提升为double
在通过
va_arg
读取时也会按照提升后的字节数进行读取,然后转换为兼容的指定类型。以兼容的类型进行读取可以自动转换;以不兼容的进行读取是未定义行为。
参数
args
- 要读取的可变参数列表T
- 要读取参数的类型
返回值
- 返回下一个参数
#示例
#include <stdio.h>
#include <stdarg.h>
// 求和函数
int sum(int count, ...)
{
// 创建并初始化可变参数列表
va_list args;
va_start(args, count);
int result = 0;
for (int i = 0; i < count; i+=1)
{
result += va_arg(args, int); // 读取下一个可变参数
}
va_end(args); // 清理可变参数列表
return result;
}
int main(void)
{
printf("%d\n", sum(9, 1, 2, 3, 4, 5, 6, 7, 8, 9));
return 0;
}
运行结果:
45
#推荐阅读
#外部参考
#参考标准
- C23 standard (ISO/IEC 9899:2024):
- 7.16.2.2 The va_arg macro (p: TBD)
- C17 standard (ISO/IEC 9899:2018):
- 7.16.1.1 The va_arg macro (p: TBD)
- C11 standard (ISO/IEC 9899:2011):
- 7.16.1.1 The va_arg macro (p: 269-270)
- C99 standard (ISO/IEC 9899:1999):
- 7.15.1.1 The va_arg macro (p: 249-250)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.8.1.2 The va_arg macro