次の方法で共有


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

'function': 書式文字列として渡された引数が不足しています
プレースホルダーとそのパラメーターには number の可変個引数が必要ですが、指定されたのは number です
不足している可変個引数 index が書式文字列 'format_string' に必要です
この引数は変換指定子で使用されます
この引数はフィールド幅として使用されます
この引数は精度として使用されます
この引数はバッファー サイズとして使用されます

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

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

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

以下の例では、書式文字列がその引数と一致しないため警告 C4473 が発生する可能性がある 2 つのケースと、問題の解決方法を示しています。

// 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 では、プレースホルダーごとに 2 つの引数が必要です。書き込み先のアドレスを指定する引数と、最初の引数のサイズを指定する 2 番目の引数です。 各ライブラリ関数のドキュメントで、必要な引数の説明を確認してください。