2016-08-09 2 views
4

fprintfというプログラムがあります。 Visual Studio 2013では、すべてがエラーと警告なしでコンパイルされ実行されました。今プロジェクトは(変更なし)のVisual Studio 2015に移行されていると私は私のfprintf通話のほとんどに、以下の警告を取得しています:Visual Studio 2013からVisual Studio 2015への移行後にprintf形式の関数を呼び出すと警告が発生する

これらの警告のほとんどは、次のコード行を指している
C4474: too many arguments passed for format string 

fprintf (stderr,"Missing header file name. Formant is :\n", pArg); 

どうすればこの問題を解決できますか?コードを書き直す必要があるのですか、これらの警告の原因となっているプロジェクト設定に何か問題がありますか?

のprintfおよびscanf関数のすべての定義はstdio.hの、conioにインラインで移動されました:私はthis MSDNの記事では、これらの機能に加えられた変更があった、ことがわかり


。 h、およびその他のCRTヘッダーを表示します。

これは私の問題に関連していますか?これはVS 2015の無害な変化ですか、またはここでも潜在的なクラッシュを誘発する落とし穴がありますか?

+8

[Visual C++ 2015での変更点](https://msdn.microsoft.com/en-us/library/bb531344.aspx)の「」の –

+1

を参照してください。あなたを正しい方向に導くことができます。 – Ajay

+0

あなたはこれをトリガし 'のprintf()' -callの例を持っていますか?あなたは未定義の動作を引き起こしているようです。 – EOF

答えて

7

Visual C++ 2015が"format specifiers checking"を導入しました。コンパイラはコンパイル時にいくつかの問題を検出し、警告を生成することができます。 2015年より前(問題は、プログラムがクラッシュを作るのに十分深刻でない限り)、書式文字列と引数の間に不一致がコンパイル時や実行時のいずれかで、任意の診断を生成しないでしょう。

表示されているコードには、pArgという余分な引数があり、fprintf()では使用されません。フォーマット文字列にはプレースホルダがないためです。

あなたはすべての警告を通過し、修正する必要があります。 無視しないでください。これらは、無害な問題または深刻なバグを示している可能性があります。いくつかの警告は/W4としか表示されないことに注意してください。常に/Wallを使用してください。

ここではいくつかの例です:

void f() 
{ 
    printf("hello, world", 42); // line 8: no %d in format string 
    printf("missing %d");   // line 9: missing argument for %d 
    printf("wrong type %f", 3); // line 10: wrong argument type 
} 

これらはcl /Wallで生成された警告です:gccは同等-wformatsince 3.0があった

a.cpp(8): warning C4474: 'printf' : too many arguments passed for format string 
a.cpp(8): note: placeholders and their parameters expect 0 variadic arguments, 
      but 1 were provided 
a.cpp(9): warning C4473: 'printf' : not enough arguments passed for format string 
a.cpp(9): note: placeholders and their parameters expect 1 variadic arguments, 
      but 0 were provided 
a.cpp(9): note: the missing variadic argument 1 is required by format string '%d' 
a.cpp(10): warning C4477: 'printf' : format string '%f' requires an argument of 
      type 'double', but variadic argument 1 has type 'int' 

注こと。

+1

Visual Studioの '/ Wall'はgccとclangの' -Wall'と同じではありません。それは実際のプロジェクトでは非現実的です(http://stackoverflow.com/questions/4001736/whats-up-with-the-thousands-of-warnings-in-standard-headers-in-msvc-wall)。 )、[マイクロソフト自身では推奨しません](https://blogs.msdn.microsoft.com/vcblog/2010/12/14/off-by-default-compiler-warnings-in-visual-c/) – Drop

+0

@Dropあなたは間違っている。 msdnブログのリンクでは、 'pragma warning'を使用してノイズの多い警告を無効にしてから、「コードベースの/ Wallスイッチをオンにする」と言います。私は*常に*すべての*私のプロジェクトでそれを有効にし、サードパーティのヘッダの周りに自分自身の 'push_warnings.h'と' pop_warnings.h'を使います。私はclang、gcc、およびVisual C++でそれらを実装しました。魅力のように動作します。 – isanae

+0

@isanaeこれは私が編集の修正を提案したのとほぼ同じ答えです。 –

関連する問題