2010-10-22 9 views
52

Alcune persone sembrano consigliarti di usare -Wall, ma quando l'ho fatto su un piccolo progetto di test che ha solo un main.cpp con alcuni include, ottengo 5800 avvisi la maggior parte di essi in intestazioni standard o in intestazioni Windows.Che succede con le migliaia di avvisi nelle intestazioni standard in MSVC-Wall?

È il comportamento previsto? Come faccio a rendere libero il mio avviso di compilazione?

Qui sono solo alcuni per un certo divertimento la lettura:

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/ 
+0

C'è un motivo per cui tali avvisi sono disabilitati per impostazione predefinita. Non utilizzare -Wall –

+0

GCC ha un modo per sopprimere gli avvisi dagli header di sistema e di libreria ('-isystem' invece di' -I' e '#pragma GCC system_header'). Lo stesso non vale per VC o '/ Wall' disabilita anche questo? – greyfade

+0

possibile duplicato di [MSVC - interrompe avvisi nelle intestazioni] (http://stackoverflow.com/questions/4292352/msvc-stop-warnings-in-headers) –

risposta

33

Visual C++ /Wall permette a tutti gli avvertimenti che sono disabilitate per default a /W4. Come hai scoperto, c'è una buona ragione per cui molti di questi avvertimenti sono disabilitati di default (grazie, compilatore, per dirmi che hai aggiunto il padding, lo apprezzo davvero!). Probabilmente è meglio usare solo /W4 su Visual C++.

Anche Intel C++ è così (non conosco altri compilatori che utilizzano il frontend EDG). Se lo si imposta su /W5, invia una serie di messaggi informativi. Il mio preferito è che ti avvisa se lo specificatore della classe di memoria non è all'inizio di una dichiarazione (quindi, const static int non è un andare, ma static const int va bene).

+25

In realtà è piuttosto deprimente che le librerie VS non consentano l'uso di -Wall. Ci sono anche ottime ragioni per cui dovrebbero essere emessi tutti gli avvertimenti. È semplicemente una cattiva codifica che le intestazioni standard stanno producendo tali avvertimenti - o il compilatore sta emettendo avvertimenti privi di senso (che VS ne ha diversi). –

+7

@edA: Non so cosa sia "deprimente" che l'uso di '/ Wall' causi molti avvertimenti: come ho spiegato nella risposta,'/Wall' abilita molti avvertimenti che, anche se potenzialmente utili a volte, non sono utile il più delle volte. '/ Wall' in Visual C++ non significa la stessa cosa di' -Wall' su g ++ (in realtà, g ++ "ha'/Wall' sbagliato, "dato che in realtà non abilita _all_ warnings). In ogni caso, in Visual C++, tutti gli avvisi comunemente importanti e utili sono abilitati da '/ W4'. –

+35

Se non è possibile compilare un programma utilizzando la libreria standard e non ricevere avvisi, l'opzione diventa praticamente inutile. Non potrai ordinare gli avvertimenti e gli avvisi della biblioteca nel tuo codice. Sono interessato solo a cose nel mio codice, non alla libreria standard. –

6

Per MSVC usare /W4.

+0

/W4 è senza preavviso – nus

+2

Beh, non c'è nulla di cui preoccuparsi circa allora – Dialecticus

21

per disabilitare gli avvisi di intestazioni di sistema su cui non hanno alcun controllo basta usare questo costrutto:

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

o più selettivo per avvertenze specifiche:

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

Questa risposta è stata trafugata da un altro Stack Overflow thread: (https://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c).

Concordo pienamente con i commenti di "edA-qa mort-ora-y". Voglio vedere tutti gli avvertimenti nel mio codice, incluse cose importanti come C4265 (DTOR non virtuale). Sebbene C4265 sia al livello di avviso 3, Microsoft, secondo la loro saggezza, lo ha disattivato per impostazione predefinita e è necessario/Wall per ottenerlo. Vedere questa pagina per maggiori informazioni su quali sono nascosti avvertimenti:

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

vedere questi e di sopprimere il rumore dalle intestazioni esterni, questa pagina dà ottimi consigli, e penso che risponde pienamente alla domanda originale che ha iniziato questa discussione:

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

Fondamentalmente si consiglia di creare un 'globale' includono file con le #pragmas appropriate per sopprimere i messaggi di avviso che non si preoccupano (forse C4820 l'imbottitura uno), in guardia contro esterna intestazioni nel modo in cui descritto sopra, quindi la compilazione con/Wall. È un lavoro, ma ne vale la pena. Sotto GCC si tratterebbe semplicemente di usare -isystem. Sviluppo di Microsoft: prendi nota! VS è un prodotto intelligente ma a volte è stupido con le cose semplici.

+0

Non è necessario usare '/ Wall'. Puoi abilitare quello specifico con '/ w34265'. D'altra parte puoi usare '/ Wall' e quindi disabilitare quelli specifici come l'avvertimento di riempimento con'/wd4820'. Sono d'accordo però che '-isystem' sarebbe una caratteristica utile. – cremno

1

Ho lo stesso problema iniziale durante la compilazione di vari stack software con VC6 e Microsoft Platform SDK (in BaseTsd.h, ad esempio).

Quello che io (noi) vogliamo fare è controllare il livello di avviso del compilatore per il nostro codice - vogliamo essere in grado di giocare con il flag/W.In pratica, come già sottolineato,/W4 abilita tutte le avvertenze generalmente utili (e anche alcune spurie ...).

Poiché il problema deriva dai file di intestazione MSFT, modifico in modo pulito i file di intestazione forniti da Microsoft. Non ci sono così tante modifiche da implementare.

Se compilatore si lamenta con avviso C4305, nel file di origine che inserire:

#pragma warning(disable : 4305) 

prima della riga incriminata, seguito da:

#pragma warning(default : 4305) 

dopo la linea incriminata. Nessun effetto collaterale. Microsoft avrebbe potuto farlo in questo modo, probabilmente.

2

in MSVC 2010

Opzioni

Proprietà Coniguration

C/C++

avanzata

Disattiva avvertenze specifiche

impostare un valore come 4820; 4996; 4514; 4710 per disabilitare esplicitamente gli avvertimenti che si considera poco importante. A quel punto si può -Wall senza preoccupazione

+0

Per essere onesti, C4514 può essere piuttosto utile a volte, non è solo la maggior parte del tempo. "C4514:' std :: bad_alloc :: bad_alloc' ottimizzato "(parafrasato) è utile, ad esempio (garantisce che non vengano generate eccezioni' bad_alloc'), ma qualcosa come "C4514: 'std :: _ Maklocbyte' ottimizzato out "o" C4514: 'std :: to_wstring' ottimizzato "(parafrasato) sarebbe generalmente inferiore. –

6

So che questo è in ritardo nel gioco, ma credo di avere un modo per utilizzare/parete per i propri file, ma non dover vedere il rumore da Microsoft o altre intestazioni "esterne". Ciò presuppone che si stiano utilizzando intestazioni precompilate tramite stdafx.h.

  1. Per il progetto, impostare il livello di allarme per/Wall (avvertimenti massimo)
  2. Per il file Stdafx.cpp, impostare il livello di allarme per/W4 (un sacco di avvertimenti abilitato ma intestazioni MS passano in silenzio)
  3. Per il progetto, sotto Disattiva avvertenze specifiche, aggiungere 4652

I primi due sembrano evidenti. Ma quando stdafx.h è incluso nei tuoi file, i livelli di avviso non corrispondono e viene emesso un avviso C4652. Che sconfigge l'intero esercizio. Ma ora quel messaggio è anche soppresso.

È un po 'noioso farlo per ogni nuovo progetto, ma non così male come molte soppressioni individuali di #pragma warning().

Problemi correlati