Skip to content

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. 小结

可变参数强大但脆弱,使用时要严格遵循类型规则并做好输入约束与文档说明。

本站内容仅供学习和研究使用。