C 可变参数(Variable Arguments)
C 通过 <stdarg.h> 提供可变参数机制,典型应用是 printf 家族。应谨慎使用,确保类型与数量一致。
1. 基本用法
c
#include <stdarg.h>
int sum_ints(int count, ...) {
va_list ap; va_start(ap, count);
int s = 0;
for (int i=0;i<count;++i) s += va_arg(ap, int);
va_end(ap);
return s;
}2. 规则与限制
- 需要一个固定参数作为锚点(如
count) - 只能按正确类型与顺序读取,否则未定义行为
- 浮点默认提升:
float作为参数传递时提升为double - 小整数提升:
char/short提升为int
3. 示例:最小 printf
c
void mini_print(const char *fmt, ...) {
va_list ap; va_start(ap, fmt);
for (const char *p = fmt; *p; ++p) {
if (*p != '%') { putchar(*p); continue; }
switch (*++p) {
case 'd': { int v = va_arg(ap, int); printf("%d", v); break; }
case 's': { const char* s = va_arg(ap, const char*); printf("%s", s); break; }
case 'c': { int ch = va_arg(ap, int); putchar(ch); break; }
default: putchar('%'); putchar(*p); break;
}
}
va_end(ap);
}4. 安全建议
- 尽量使用带类型检查的变体(如 C11
_Generic或函数重载替代方案) - 设计清晰的格式/协议,避免类型不匹配
5. 小结
可变参数强大但脆弱,使用时要严格遵循类型规则并做好输入约束与文档说明。