警告 C26826

请勿使用 C 样式变量参数(f.55)。

注解

有关详细信息,请参阅 C++ Core Guidelines 中的 F.55:请勿使用 va_arg 参数

此检查会针对 va_listva_startva_argva_end 的所有使用发出警告,阻止使用 C 样式变量参数。 C 样式变量参数不安全,因为它们要求程序员假定这些参数都以正确的类型传递和读取。

警告 C26826 自 Visual Studio 2022 版本 17.1 起可用。

示例

int sum(int n, ...) {
    va_list l; // C26826 Don't use C-style variable arguments
    va_start(l, n); // C26826 Don't use C-style variable arguments

    int s = 0;
    for (int i = 0; i < n; ++i) {
        // BAD, assumes the variable arguments will be passed as ints
        s += va_arg(l, int); // C26826 Don't use C-style variable arguments
    }

    va_end(l); // C26826 Don't use C-style variable arguments
    return s;
}

int main() {
    sum(2, 1, 2, 3); // ok
    sum(2, 1.5, 3.14159, 2.71828); // BAD, undefined
}

C 样式变量参数的替代项包括:

  • 函数重载
  • 可变参数模板
  • std::variant 参数
  • std::initializer_list