编译器警告(等级 1)C4473

“function”:没有为格式字符串传递足够的参数
占位符和其参数希望获取可变数字参数,但提供的却是数字参数
格式字符串“format_string”需要缺少的可变参数索引
此参数由转换说明符使用
此参数用作字段宽度
此参数用作精度
此参数用作缓冲区大小

编译器检测到满足格式字符串中占位符所需的参数数与提供的参数数不匹配。 正确使用 variadic 函数的 printf 和 scanf 系列需要提供格式字符串指定的任意数量的参数。 某些占位符需要其他参数,以指定宽度、精度或缓冲区大小以及内容的参数。 不匹配通常意味着代码中有一个 bug。

有关与 printf 系列格式字符串占位符相关的参数的信息,请参阅格式规范语法:printf 和 wprintf 函数。 有关特定于函数 function 的信息,请参阅文档

此警告是 Visual Studio 2015 的新增功能。

示例

这些示例显示了两种方法,警告 C4473 可能是由于格式字符串与其参数不匹配导致的,还显示了如何修复问题。

// c4473p.cpp
// compile with: cl /c /W4 c4473p.cpp
#include <stdio.h>

void print_func(int a, float f)
{
    printf_s("This takes %*f arguments.\n", f); // C4473, missing * width argument
    printf_s("This takes %*f arguments.\n", a, f); // fix: supply width argument
}

在第一条错误消息中,编译器检测到参数缺失,但无法判断缺少的参数是宽度还是内容,因此假定提供的参数是第一个参数(宽度),缺少的参数是第二个参数(类型转换说明符)。 必须检查格式字符串以确定实际缺少的参数。

// c4473s.cpp
// compile with: cl /c /W4 c4473s.cpp
#include <stdio.h>

void scan_func(int a, float f)
{
    char name[20];

    scanf_s("%s", &name);                // C4473, missing buffer size argument
    scanf_s("%s", &name, sizeof(name));  // fix: supply buffer size argument
}

在此示例中,scanf_s 要求每个占位符具有两个参数,一个提供要写入的地址,另一个提供第一个占位符的大小。 查看每个库函数的文档,了解所需参数的说明。