函數參數個數不固定,需將所有整數參數累加返回。首參 count 指定后續參數個數。
#include <stdio.h>
#include <stdarg.h>
int add(int count, ...) {
va_list ap;
va_start(ap, count);
int sum = 0;
for (int i = 0; i < count; i++)
sum += va_arg(ap, int);
va_end(ap);
return sum;
}
int main() {
printf("%d\n", add(3, 5, 5, 6)); // 16
printf("%d\n", add(10, 1,2,3,4,5,6,7,8,9,10)); // 55
return 0;
}
va_list ap; 定義參數列表游標。va_start(ap, last_fixed_arg); 初始化,last_fixed_arg 是最后一個固定參數(此處為 count)。va_arg(ap, type) 依次取出參數,**調用者必須保證類型匹配**,否則未定義行為。va_end(ap); 清理(某些架構需棧指針恢復)。double 但用 va_arg(ap, int) 取值會導致棧錯位、結果錯誤。count,讀取越界;多于則忽略多餘。template<typename... Args> auto add(Args... args))實現編譯期類型安全。count 參數的哨兵模式int add_sentinel(int first, ...) { // 以 -1 結束
va_list ap; va_start(ap, first);
int sum = first;
while (1) {
int v = va_arg(ap, int);
if (v == -1) break;
sum += v;
}
va_end(ap); return sum;
}
// 用法:add_sentinel(1,2,3,4,5,-1);
stdarg.h 機制讓 C 支持可變參數函數,核心是調用者知曉參數個數與類型、被調用者按約定順序取參。動態累加是最典型的教學示例,實際項目中常用於日志格式化(log(fmt, ...))、字符串拼接、消息構造等場景。