Soru MSVC -Wall'daki standart başlıklardaki binlerce uyarı nedir?


Bazı insanlar -Wall kullanmanızı önerir gibi görünüyor, ancak bazı içerir bir main.cpp sahip küçük bir test projesinde yaptım, çoğu standart başlık veya pencere başlığında 5800 uyarıları olsun.

Bu amaçlanan davranış mı? Derleme uyarımı ücretsiz hale getirmeye nasıl başlarım?

İşte bazı okuma eğlenceleri için sadece birkaçı:

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/

54
2017-10-22 23:55


Menşei


Bu uyarıların varsayılan olarak devre dışı bırakılmasının bir nedeni vardır. -Wall kullanma - Benjamin Lindley
GCC'nin sistem ve kitaplık başlıklarından uyarıları bastırmanın bir yolu vardır (-isystem yerine -I ve #pragma GCC system_header). Aynı şey VC için de geçerli değil mi? /Wall Bunu bile devre dışı bıraktın mı? - greyfade
olası kopyası MSVC - başlıklarda uyarıları durdur - Cody Gray♦
için Oyla visualstudio.uservoice.com/forums/121579-visual-studio-ide/... - Trass3r


Cevaplar:


Visual C ++ /Wall varsayılan olarak devre dışı bırakılmış tüm uyarıları etkinleştirir /W4. Bulunduğunuz gibi, bu uyarıların çoğunun varsayılan olarak devre dışı bırakılmasının iyi bir nedeni var (teşekkürler, derleyici, eklediğinizi anladığın için; gerçekten takdir ediyorum!). Sadece kullanmak en iyisi /W4 Visual C ++ üzerinde.

Intel C ++ da bu gibi (EDG ön ucunu kullanan diğer derleyiciler hakkında bilmiyorum). Eğer onu /W5Bu, tonlarca bilgi mesajını yayıyor. Kişisel favorim, depolama sınıfı belirtecinin bir bildirimin başlangıcında olmaması durumunda sizi uyarmasıdır ( const static int gitmiyor ama static const int iyi).


34
2017-10-23 00:02



Bu aslında VS kütüphanelerinin -Wall kullanımına izin vermemesi oldukça sıkıntılı. Tüm uyarıların neden yayılmasının çok iyi sebepleri vardır. Standart başlıkların bu gibi uyarıları üretmesi çok zayıf bir koddur - ya da derleyici saçma sapan uyarılar yayar (VS'nin birkaçı vardır). - edA-qa mort-ora-y
@edA: Kullanımı ne kadar "iç karartıcı" olduğunu bilmiyorum /Wall çok uyarı veriyor: cevabımda açıkladığım gibi, /Wall Potansiyel olarak yararlı olsa da, çoğu zaman yararlı olmayan birçok uyarıya olanak tanır. /Wall Visual C ++ ile aynı şey demek değildir -Wall g ++ (gerçekten, g ++ "üzerinde /Wall yanlış, "aslında etkinleştirmediği için herşey uyarılar). Her durumda, Visual C ++ 'da, yaygın olarak kullanılan önemli ve yararlı uyarıların tümü /W4. - James McNellis
Bir programı standart kütüphaneyi kullanarak derleyemiyorsanız ve uyarılar almıyorsanız, hemen hemen seçeneği gereksiz kılar. Kodunuzda kütüphane uyarılarını ve uyarılarını sıralayamazsınız. Sadece kodumdaki şeylerle ilgileniyorum, standart kütüphane değil. - edA-qa mort-ora-y
@ edA-qamort-ora-y Sorun, bunun yerine, bir çok "uyarının" aslında not olması gerektiğidir. Noktada durum, C4820 ("Uyarı: Eklenmiş dolgu.") Veya C4514 ("Uyarı: Hiçbir zaman çağrılmadığınız bir satır içi işlevi optimize ettim."). Bazıları bilmek yararlıdır, ancak değiştirebileceğiniz bir şey değil (C4710 gibi) inline işlev aslında satır içi değil. ") std::swprintf(), değişken değişken listesi olduğundan). - Justin Time
Bazıları Gerçekten mi yararlı, ama yine de notlar olmalı. Örnekte, C4514 (tekrar), tekrarlamayan fonksiyon olduğunda, std::bad_alloc::bad_alloc; Diğer şeylerin yanı sıra atılmayacak istisnaların hızlı ve kirli bir listesi için C4514 uyarılarını kontrol edebilirsiniz. - Justin Time


Denetimi olmayan sistem üstbilgilerinden uyarıları devre dışı bırakmak için sadece şu yapıyı kullanın:

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

veya belirli uyarılar için seçmeli olarak:

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

Bu cevap başka bir Yığın Taşması iş parçacığından (:https://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c).

"EdA-qa mort-ora-y" tarafından yapılan yorumlara tamamen katılıyorum. C4265 (DTOR sanal değil) gibi önemli şeyler de dahil olmak üzere kodumdaki tüm uyarıları görmek istiyorum. C4265 uyarı seviyesi 3 olmasına rağmen, Microsoft kendi bilgeliklerinde varsayılan olarak onu kapatmış ve almak için / Duvara ihtiyacınız var. Hangi uyarıların gizlendiği hakkında daha fazla bilgi için bu sayfaya bakın:

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

Bunları görmek ve dış başlıklardan gelen gürültüyü bastırmak için, bu sayfa büyük bir öneri sunar ve bence bu konuyu başlatan asıl soruya tam olarak cevap verir:

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

Temelde, yukarıda belirtildiği şekilde dış başlıklara karşı koruma sağlamak için, umursamadığınız uyarıları bastırmak için uygun bir #pragma dosyası içeren "global" bir dosya oluşturmayı önerir (belki de C4820 bir dolgu), ardından Duvar. Bu bir iş parçası, ama buna değer. GCC altında bu sadece bir sistem kullanma meselesi olurdu. Microsoft geliştirme: not al! VS, akıllı bir üründür ancak bazen basit şeylerle gerçekten aptalcadır.


24
2018-05-18 19:20



Kullanmak zorunda değilsin /Wall. Bu özel olanı etkinleştirebilirsiniz /w34265. Öte yandan kullanabilirsiniz /Wall ve sonra doldurma uyarısı gibi belirli olanları devre dışı bırak /wd4820. Buna katılıyorum -isystem yararlı bir özellik olurdu. - cremno


Bunun oyunda geç olduğunu biliyorum ama kendi dosyalarınız için / Wall kullanmanın bir yolunun olduğuna inanıyorum ama değil Microsoft veya diğer "harici" başlıklardan gelen gürültüyü görmek zorunda. Bu, stdafx.h aracılığıyla önceden derlenmiş üstbilgileri kullandığınızı varsayar.

  1. Proje için uyarı seviyesini / Duvar olarak ayarlayın (maksimum uyarı)
  2. Stdafx.cpp dosyası için, uyarı seviyesini / W4 olarak ayarlayın (birçok uyarı etkinleştirildi ancak MS başlıkları sessiz bir şekilde geçiyor)
  3. Proje için, Özel Uyarıları Devre Dışı Bırak altında, 4652 ekleyin

İlk ikisi açık görünüyor. Ancak stdafx.h kendi dosyalarınıza eklendiğinde, uyarı seviyeleri uyuşmaz ve C4652 uyarısı verilir. Tüm egzersizi yener. Ama şimdi bu mesaj da bastırılıyor.

Her yeni proje için bunu yapmak çok sıkıcı ama bireysel #pragma uyarı () bastırmaları kadar kötü değil.


7
2017-09-26 16:55





MSVC kullanımı için /W4.


6
2017-10-22 23:57



/ W4 ücretsiz uyarı veriyor
O zaman endişelenecek bir şey yok. - Dialecticus


MSVC 2010'da

Seçenekler

Coniguration Özellikleri

C / C ++

ileri

Belirli Uyarıları Devre Dışı Bırak

gibi bir değer ayarla 4820; 4996; 4514; 4710 Açıkçası önemsiz olduğunu düşündüğünüz uyarıları devre dışı bırakın. Bu noktada yapabilirsiniz -DUVAR endişesiz


2
2017-08-27 15:49



Adil olmak gerekirse, C4514 bazen oldukça kullanışlı olabilir, çoğu zaman değildir. "C4514: std::bad_alloc::bad_alloc "(iyileştirilmiş)" iyi tasarlanmış, bilmek iyidir, örneğin, bad_alloc istisnalar atılacak), fakat "C4514: 'std :: _ Maklocbyte' 'en iyi duruma getirilmiş" veya "C4514:' std :: to_wstring '(en iyi duruma getirilmiş)" (değiştirilmiş) gibi şeyler genellikle daha az olacaktır. - Justin Time


VC6 ve Microsoft Platform SDK ile (örneğin, BaseTsd.h'de) çeşitli yazılım yığınlarını derlerken aynı başlangıç ​​sorununa sahibim.

Ben (biz) yapmak istediğimiz, kodumuz için derleyici uyarı seviyesini kontrol etmektir - biz / W bayrağıyla oynayabilmek istiyoruz. Pratikte, daha önce de belirtildiği gibi, / W4 tüm genel uyarıları (ve aynı zamanda bazı sahte ...) mümkün kılar.

Sorun MSFT üstbilgi dosyalarından geldiğinden, Microsoft tarafından sağlanan üstbilgi dosyalarını temiz bir şekilde değiştiriyorum. Uygulanacak çok fazla değişiklik yok.

Derleyici C4305 uyarısı ile şikayet ederse, eklediğim kaynak dosyasında:

#pragma warning( disable : 4305)

ihbar hattından önce, ardından

#pragma warning( default : 4305)

rahatsız edici çizgiden sonra. Yan etkisi yok. Microsoft muhtemelen bu şekilde yapmış olabilir.


1
2017-08-27 15:23