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

'function': 書式文字列 'string' は型が 'type' の引数を必要としますが、variadic 引数 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 が与えられたことを示しています。 コンパイラは、引数の順序を入れ替えたことを認識できません。 書式文字列を調べて実際の引数の順序を決定し、正しい引数の型を指定する必要があります。