2339

12 分钟

#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

创建于 2025/10/18

更新于 2025/10/18