web-dev-qa-db-ja.com

MSVC -Wallの標準ヘッダーの何千もの警告はどうなっていますか?

一部の人は-Wallを使用するようにアドバイスしているようですが、main.cppにいくつかのインクルードがあるだけの小さなテストプロジェクトでそれを行った場合、標準ヘッダーまたはWindowsヘッダーでそれらのほとんどに5800警告が表示されます。

それは意図された動作ですか?コンパイル警告を無料にする方法を教えてください。

以下は、読書を楽しむためのほんの一部です。

1>c:\program files\Microsoft visual studio 10.0\vc\include\stdint.h(105): warning C4668: '_INTPTR' is not defined as a preprocessor macro, replacing with '0' for '#if/#Elif'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(109): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::attrib'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(114): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::name'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(118): warning C4820: '_wfinddata64_t' : '4' bytes padding added after data member '_wfinddata64_t::attrib'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(488): warning C4820: '_stat32' : '2' bytes padding added after data member '_stat32::st_gid'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(504): warning C4820: 'stat' : '2' bytes padding added after data member 'stat::st_gid'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(520): warning C4820: '_stat32i64' : '2' bytes padding added after data member '_stat32i64::st_gid'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(521): warning C4820: '_stat32i64' : '4' bytes padding added after data member '_stat32i64::st_rdev'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(525): warning C4820: '_stat32i64' : '4' bytes padding added after data member '_stat32i64::st_ctime'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(534): warning C4820: '_stat64i32' : '2' bytes padding added after data member '_stat64i32::st_gid'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(548): warning C4820: '_stat64' : '2' bytes padding added after data member '_stat64::st_gid'
1>c:\program files\Microsoft visual studio 10.0\vc\include\wchar.h(549): warning C4820: '_stat64' : '4' bytes padding added after data member '_stat64::st_rdev'
1>c:\program files\Microsoft visual studio 10.0\vc\include\crtdbg.h(1078): warning C4986: 'operator new[]': exception specification does not match previous declaration
1>          c:\program files\Microsoft visual studio 10.0\vc\include\new(79) : see declaration of 'operator new[]'
1>c:\program files\Microsoft visual studio 10.0\vc\include\crtdbg.h(1095): warning C4986: 'operator delete[]': exception specification does not match previous declaration
1>          c:\program files\Microsoft visual studio 10.0\vc\include\new(77) : see declaration of 'operator delete[]'
1>c:\program files\Microsoft visual studio 10.0\vc\include\typeinfo(76): warning C4820: 'type_info' : '3' bytes padding added after data member 'type_info::_M_d_name'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\basetsd.h(114): warning C4668: '__midl' is not defined as a preprocessor macro, replacing with '0' for '#if/#Elif'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(8154): warning C4820: '_SECURITY_QUALITY_OF_SERVICE' : '2' bytes padding added after data member '_SECURITY_QUALITY_OF_SERVICE::EffectiveOnly'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(8165): warning C4820: '_SE_IMPERSONATION_STATE' : '2' bytes padding added after data member '_SE_IMPERSONATION_STATE::EffectiveOnly'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(8334): warning C4820: '_QUOTA_LIMITS' : '4' bytes padding added after data member '_QUOTA_LIMITS::PagefileLimit'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(8357): warning C4820: '_QUOTA_LIMITS_EX' : '4' bytes padding added after data member '_QUOTA_LIMITS_EX::PagefileLimit'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(8405): warning C4820: '_JOBOBJECT_BASIC_LIMIT_INFORMATION' : '4' bytes padding added after data member '_JOBOBJECT_BASIC_LIMIT_INFORMATION::SchedulingClass'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(8984): warning C4820: '_FILE_NOTIFY_INFORMATION' : '2' bytes padding added after data member '_FILE_NOTIFY_INFORMATION::FileName'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(9012): warning C4820: '_REPARSE_GUID_DATA_BUFFER' : '3' bytes padding added after data member '_REPARSE_GUID_DATA_BUFFER::GenericReparseBuffer'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(10131): warning C4820: '<unnamed-tag>' : '3' bytes padding added after data member '<unnamed-tag>::Data'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(10241): warning C4820: '<unnamed-tag>' : '4' bytes padding added after data member '<unnamed-tag>::DecreaseTime'
1>c:\program files\Microsoft sdks\windows\v7.0a\include\winnt.h(10262): warning C4820: '<unnamed-tag>' : '4' bytes padding added after data member '<unnamed-tag>::TimerInterval' 
1>c:\program files\Microsoft sdks\windows\v7.0a\include\wincrypt.h(1440): warning C4668: 'NTDDI_WINLH' is not defined as a preprocessor macro, replacing with '0' for '#if/
63
user1115652

Visual C++ /Wallは、デフォルトで/W4で無効になっているすべての警告を有効にします。ご存知のように、これらの警告の多くがデフォルトで無効にされているのには十分な理由があります(パディングを追加したことを教えてくれたコンパイラに感謝します。本当に感謝しています!)。 Visual C++で/W4を使用することをお勧めします。

インテルC++も同様です(EDGフロントエンドを利用する他のコンパイラーについては知りません)。 /W5に設定すると、大量の情報メッセージが出力されます。私の個人的なお気に入りは、ストレージクラス指定子が宣言の先頭にない場合に警告することです(したがって、const static intは使用できませんが、static const intで問題ありません)。

40
James McNellis

制御できないシステムヘッダーからの警告を無効にするには、次の構文を使用します。

#pragma warning(Push, 0)       
//Some includes with unfixable warnings
#pragma warning(pop)

または特定の警告に対してより選択的に:

#pragma warning( Push )
#pragma warning( disable : 4081)
#pragma warning( disable : 4706 )
// system header includes 
#pragma warning( pop )

この回答は別のスタックオーバーフロースレッドから借用されました:( https://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c ) 。

「edA-qa mort-ora-y」のコメントに完全に同意します。 C4265(DTORは仮想ではない)などの重要なものを含め、コード内のすべての警告を表示したい。 C4265は警告レベル3ですが、Microsoftの知恵ではデフォルトでオフになっているため、取得するには/ Wallが必要です。非表示になっている警告の詳細については、このページを参照してください。

http://msdn.Microsoft.com/en-GB/library/23k5d385(v = vs.80).aspx

これらを確認し、外部ヘッダーからのノイズを抑制するために、このページは素晴らしいアドバイスを提供し、このスレッドを開始した元の質問に完全に答えると思います:

http://blogs.msdn.com/b/vcblog/archive/2010/12/14/off-by-default-compiler-warnings-in-visual-c.aspx

基本的に、適切な#pragmasを使用して「グローバル」インクルードファイルを作成し、気にしない警告(多分C4820のパディング)を抑制し、上記の方法で外部ヘッダーから保護し、次に/でコンパイルすることをお勧めします壁。これは簡単な作業ですが、それだけの価値があります。 GCCの下では、それは-isystemの使用に関する問題です。マイクロソフトの開発:注意してください! VSはスマートな製品ですが、単純なものでは時々本当に馬鹿げています。

27
woodspiral

私はこれがゲームの後半にあることを知っていますが、自分のファイルに/ Wallを使用する方法があると思いますが、notは、Microsoftまたは他の「外部」ヘッダーからのノイズを確認する必要があります。これは、stdafx.hを介してプリコンパイル済みヘッダーを使用していることを前提としています。

  1. プロジェクトの警告レベルを/ Wall(最大警告)に設定します
  2. Stdafx.cppファイルの場合、警告レベルを/ W4に設定します(多くの警告が有効ですが、MSヘッダーは通知なしで渡されます)
  3. プロジェクトの[特定の警告を無効にする]の下に4652を追加します

最初の2つは明らかなようです。しかし、stdafx.hが独自のファイルに含まれている場合、警告レベルが一致せず、警告C4652が発行されます。これは全体の運動を打ち負かします。しかし今、そのメッセージも抑制されています。

新しいプロジェクトごとにこれを行うのは少し面倒ですが、個々の#pragma warning()抑制の数ほど多くはありません。

9
Harold Bamford

MSVCの場合は/W4

mSVC 2010

オプション

構成プロパティ

C/C++

詳細

特定の警告を無効にする

4820; 4996; 4514; 471のような値を設定して、重要ではないと考える警告を明示的に無効にします。その時点で、心配することなく-WALLできます。

2
EvilTeach

VC6およびMicrosoft Platform SDK(BaseTsd.hなど)を使用してさまざまなソフトウェアスタックをコンパイルするときに、同じ初期問題が発生します。

私がしたいことは、コードのコンパイラ警告レベルを制御することです。/Wフラグを使用して再生できるようにしたいのです。実際には、すでに指摘したように、/ W4は一般的に有用なすべての警告を有効にします(また、いくつかの偽の...)。

問題はMSFTヘッダーファイルに起因するため、Microsoft提供のヘッダーファイルをきれいに変更します。実装する変更はそれほど多くありません。

コンパイラーが警告C4305で不平を言った場合、ソースファイルに以下を挿入します。

#pragma warning( disable : 4305)

問題のある行の前に、次が続きます:

#pragma warning( default : 4305)

問題のある行の後。副作用はありません。マイクロソフトはおそらくこの方法でそれを行っていたはずです。

1
Bruno Bonnefont