#C 语言标准库函数 va_start
/*********************************************
* @brief 初始化可变参数列表
* @param args 要初始化的可变参数列表
* @param lastParam 最后一个具名参数
********************************************/
void va_start(va_list args, lastParam);
说明
初始化可变参数列表 args
。
在函数返回之前,可变参数列表 arg
必须使用 va_end 函数进行清理,否则是未定义行为。
参数
args
- 要初始化的可变参数列表lastParam
- 最后一个具名参数,用于定位可变参数
返回值
无
C23 中
va_start
不再需要lastParam
参数进行定位,定义变更为:
void va_start(va_list args, ...);
...
可以接受任意参数,va_start
并不使用这些参数,仅仅用于兼容以前的代码。
#示例
#include <stdio.h>
#include <stdarg.h>
#if __STDC_VERSION__ < 202311L
// C23 之前
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;
}
#else
// C23 之后
int sum(...) // 可以没有具名参数
{
// 创建并初始化可变参数列表
va_list args;
va_start(args); // 不再需要最后一个具名参数
int result = 0;
int count = va_arg(args, int); // 读取下一个可变参数
for (int i = 0; i < count; i+=1)
{
result += va_arg(args, int); // 读取下一个可变参数
}
va_end(args); // 清理可变参数列表
return result;
}
#endif
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.1.4 The va_start macro (p: TBD)
- C17 standard (ISO/IEC 9899:2018):
- 7.16.1.4 The va_start macro (p: 198-199)
- C11 standard (ISO/IEC 9899:2011):
- 7.16.1.4 The va_start macro (p: 271-272)
- C99 standard (ISO/IEC 9899:1999):
- 7.15.1.4 The va_start macro (p: 251-252)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.8.1.1 The va_start macro