コンパイラの警告 (レベル 1) C4477

'function': 書式文字列 'string' には、型 'type' の引数が必要ですが、可変個引数 number は型 'type' です

コンパイラは、書式文字列のプレースホルダーを満たすために必要な引数の型と、指定された引数の型との間に不一致があることを検出しました。 printf や scanf といった可変長の関数を正しく使うには、書式文字列で指定された型の引数を与える必要があります。 通常、不一致はコードにバグがあることを意味します。

printf 系の書式文字列プレースホルダーに関連する引数の詳細については、「書式指定構文: printf および wprintf 関数」を参照してください。 関数 function に固有の情報については、ドキュメントを参照してください。

この警告は Visual Studio 2015 で新たに追加されたものです。

このサンプルでは、最初の printf_s 関数の 2 つの C4477 警告を示します。2 つの引数が間違った型であることが判明した場合、問題を修正する方法も示しています。

// 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 の引数が与えられていることをコンパイラが検出しています。 可変個引数リストで、floatdouble に自動的に昇格します。 2 番目のエラー メッセージは、コンパイラが double の引数を予期していたのに、int が与えられたことを示しています。 コンパイラは、引数の順序を入れ替えたことを認識できません。 書式文字列を調べて実際の引数の順序を決定し、正しい引数の型を指定する必要があります。