编译器警告(等级 1)C4477

“function”:格式字符串“string”需要类型为“type”的参数,但可变参数 number 的类型为“type”

编译器检测到满足格式字符串中占位符所需的参数类型与提供的参数类型不匹配。 正确使用可变参数函数的 printf 和 scanf 系列需要提供格式字符串指定的类型的参数。 不匹配通常意味着代码中有一个 bug。

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

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

示例

此示例显示了发现两个参数的类型错误时,第一个 printf_s 函数的两个 C4477 警告,还显示了如何修复问题。

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

void print_func(int a, float f)
{
    printf_s("This takes int and double arguments %d and %f.\n", f, a); // C4477, expected int then double
    printf_s("This takes int and double arguments %d and %f.\n", a, f); // fix: types in correct order
}

在第一条错误消息中,编译器检测到在需要 int 时提供了 double 参数。 在可变参数列表中,float 会自动提升为 double。 第二条错误消息显示编译器需要 double 参数,但提供了 int 参数。 编译器无法判断是否交换了参数的顺序。 你必须检查格式字符串以确定实际的参数顺序并提供正确的参数类型。