Kütüphane başlıklarından GCC uyarıları nasıl engellenir?


126

Başlıkları çok sayıda (tekrarlayan) uyarı oluşturan log4cxx, boost vb. Kitaplıkları kullanan bir projem var. Kitaplık içerenlerden (ör. #İnclude <bir-başlık.h>) veya belirli yollardan gelen uyarıları engellemenin bir yolu var mı? -Wall ve / veya -Wextra'yı her zamanki gibi proje kodunda ilgili bilgiler gizlenmeden kullanmak istiyorum. Şu anda make output'ta grep kullanıyorum ama daha iyi bir şey istiyorum.

Yanıtlar:


127

Sen kullanarak kütüphane başlıklarını içerecek şekilde çalışabilir -isystemyerine -I. Bu, onları "sistem başlıkları" yapar ve GCC onlar için uyarı bildirmez.


11
Bunu XCode'da yapmaya çalışıyorsanız, hedef derleme ayarlarınızdaki "özel derleyici bayrakları" nda "diğer C ++ bayraklarına" -isistem yolunu yapıştırın.
Matt Parkins

3
Olası dezavantajlardan biri, bazı platformlarda, g ++ 'nın herhangi bir sistem üstbilgisini otomatik olarak sarmalaması ve bir yoldaki bir C ++ başlığınız extern "C"varsa C bağlantısıyla ilgili tuhaf hatalara yol açmasıdır. #include-isystem
Tavian Barnes

1
+1, can sıkıcı destek uyarılarıyla sorunları
çözmeme

3
Neden bu, OP'nin 1.5 saat önce aynı şeyi söyleyen kendi cevabından çok daha fazla oy aldı?
underscore_d

1
Xcode için: Hedef derleme ayarlarımdaki "Diğer C ++ bayrakları" nda klasör yolu yoksa ne olur? Birisi bu çözümleri detaylandırabilir mi?
Ossir

107

CMake kullananlar için, include_directoriesdirektiflerinizi SYSTEMbu tür başlıklara karşı uyarıları engelleyen sembolü içerecek şekilde değiştirebilirsiniz .

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^

Kitaplık, ${LIBFOO_USE_FILE}CMake'nin include () komutuyla kullanılacak bir değişken sağlıyorsa ne olur ?
waldyrious

2
Bu benim sorunumun neredeyse çözümü gibi görünüyor. 1.) Bir ikili hedefim var, bu 2.) sadece kendi yazdığım bir başlık hedefine bağlı, 3.) bazı harici kütüphaneler. Sadece 1 ve 2 için nasıl uyarı alacağım hakkında hiçbir fikrim yok. Herhangi bir fikrin var mı?
knedlsepp

2
İşe yaramıyor gibi görünüyor. Bunu kullanan bir proje ile denedim easylogging++ve easylogging++.hbulunduğu klasör SYSTEMseçeneğe dahil edilmiş olmasına rağmen aynı miktarda uyarı alıyorum .
rbaleksandar

Bunun için ÇOK teşekkürler. Beni sayfalardan ve uyarı sayfalarından kurtardı.
Svalorzen

1
Kabul edilen cevapla aynı yorum: Bu benim için kötü bir uygulama.
Raffi

55

Pragmaları kullanabilirsiniz. Örneğin:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop

3
Yalnızca GCC> = 4.6 ile kullanılabilir
Caduchon

1
Push / pop pragma yeteneğini seviyorum. Yıllar önce mevcut olan ve C / C ++ için sinirli / kıskanç olan java gibi bir şeyi hatırlıyorum. Bunun gcc
Trevor Boyd Smith

@TrevorBoydSmith MS clde yıllardır bu yeteneğe sahipti ... Bazen gccadapte olmak biraz yavaş.
Alexis Wilke

29

Numarayı buldum. Kütüphane için yerine içerir -Idirkullanımı -isystem dirmakefile. GCC daha sonra, sistem bunlardan gelen uyarıları içerdiği ve göz ardı ettiği gibi boost vb. Davranır.


Önceden derlenmiş başlık kullanırsanız, hem başlığı hem de kodu derlerken bayrağı eklemeniz gerektiğini unutmayın.
user202729

9

#pragmaderleyiciye yönelik talimatlardır. #include'dan önce bir şey ayarlayabilir ve sonra devre dışı bırakabilirsiniz.

Bunu komut satırından da yapabilirsiniz .

Özellikle uyarıların devre dışı bırakılmasıyla ilgili başka bir GCC sayfası .

Kaynak kod içinde # pragma kullanma seçeneğini tercih ederim ve sonra uyarıları neden devre dışı bıraktığınıza dair sağlam bir neden (yorum olarak) sağlardım. Bu, başlık dosyaları hakkında mantık yürütmek anlamına gelir.

GCC buna uyarı türlerini sınıflandırarak yaklaşır . Bunları uyarı olarak veya göz ardı edilmek üzere sınıflandırabilirsiniz. Daha önce bağlantılı makaleler, hangi uyarıların devre dışı bırakılabileceğini size gösterecektir.

Not: Ayrıca, öznitelikleri kullanarak belirli uyarıları önlemek için kaynak koduna masaj yapabilirsiniz ; ancak bu sizi GCC ile oldukça yakından bağlar.

Not2: GCC ayrıca microsoft'un derleyicisinde kullanılan pop / push arabirimini kullanır - Microsoft, bu arabirim aracılığıyla uyarıları devre dışı bırakır. Mümkün olup olmadığını bile bilmediğim için bunu daha fazla araştırmanızı öneririm.


Pragmaları düşündüm, ancak bir üstbilgi eklemeden önce bir uyarıyı bastırırsam, #include'dan sonraki önceki duruma nasıl geri dönebilirim ? Proje kodu için tüm uyarıları görmek istiyorum (bana zaten birkaç kez yardımcı oldu) ancak komut satırından kontrole sahip olmak istiyorum.
AdSR

4

Önceden derlenmiş üstbilgileri kullanmayı deneyebilirsiniz . Uyarılar kaybolmaz ama en azından ana derlemenizde görünmez.


1
Bu aslında iyi bir fikir olabilir. Üçüncü taraf içerikler her gün değişmez.
AdSR

Kesinlikle. Onları Linux'ta o kadar kullanmamış olsam da, Visual Studio'da oldukça iyi çalışıyorlar.
Pablo Santa Cruz

Hayır, onları bastırmak için başka bir yol kullanmazsanız (örneğin -isystem, hem başlığı derlerken hem de kodda kullanmayı unutmayın)
user202729


1

Aşağıdakileri koymak

#pragma GCC system_header

bu dosyadaki tüm aşağıdaki kodlar için GCC uyarılarını kapatır.


-9

Bu uyarıların nedenleri olmalı. Bunlar, kitaplığı kullanan kodunuzdaki hatalardan veya kitaplık kodunun kendisindeki hatalardan kaynaklanacaktır. İlk durumda, kodunuzu düzeltin. İkinci durumda, ya kitaplığı kullanmayı bırakın ya da bu FOSS koduysa düzeltin.


İyi tavsiye için +1: D ama belirli bir şeyin nasıl yapılacağını soruyor: D
Hassan Syed

4
Özellikle 3. taraf kodunda, özellikle Boost gibi meta programlama açısından zengin kodda bazı uyarıların düzeltilmesi imkansız veya çok zordur .
ulidtko

3
Daha da kötüsü, beni rahatsız eden şey, "c 'gölgelerinin beyanı," bu "[-Werror = shadow]" un bir üyesini derin, bazı güçlendirme başlığının derinliğidir. Bu kesinlikle bir sorun değil, ancak bu ve benzeri sorunlar çıktı fışkırtıyor ve kod tabanımızda örnekleri gerçek bir gölgeleme bulmamı zorlaştırıyor.
dmckee --- eski moderatör kedi yavrusu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.