Bir çeviri biriminin yalnızca bir kısmı için GCC uyarıları seçici olarak devre dışı bırakılsın mı?


85

Bu MSVC ön işlemci koduna en yakın GCC eşdeğeri nedir?

#pragma warning( push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

Belirli bir uyarı oluşturmak istemediğimiz, yaygın olarak dahil edilen başlıklarda kodumuz var. Bununla birlikte, bu başlıkları içeren dosyaların bu uyarıyı oluşturmaya devam etmesini istiyoruz (projede bu uyarı etkinleştirilmişse).


Üstbilgiler / usr / include veya neye sahip olduğunuza yüklendiyse, gcc varsayılan olarak onlar için uyarılar oluşturmaz.
Spudd86

Yanıtlar:


95

Bu, GCC'de 4.6 sürümünden beri veya bagajda Haziran 2010 civarında mümkündür .

İşte bir örnek:

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */

8
Push ve pop işlevi gcc 4.6'ya eklendi ( gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html ).
Dave Johansen

1
İki kez patlayacaksan muhtemelen iki kez itmek isteyeceksin.
Dan

2
@Dan: Kılavuzu okuyun ve yorum yapın. Örneğin kökenine dikkat edin.
Matt Joiner

Bilginize, 4.4.7 gibi eski sürümler için hala kullanabilirsiniz, #pragma GCC diagnostic [error|warning|ignored]ancak popuygulanmaz / desteklenmez.
Trevor Boyd Smith

36

Yakın şeydir GCC tanı Pragma , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever". İstediğiniz şeye çok yakın değil ve ayrıntılar ve uyarılar için bağlantıya bakın.


1
Bu özelliği eklememenin gerekçesinin ne ve nerede olabileceğini biliyor musunuz? (Bulamadım.) Push-disable-pop uyarısını faydalı buluyorum.

1
Gcc'ye "özellik eklememenin", çalışan bir yama gönderen kimsenin olmaması kadar bir mantığı olduğunu gerçekten düşünmüyorum.
kaos

14
Kimsenin gcc'de bu tür ince taneli uyarı kontrolü için işi yapmaya istekli olmadığı veya kodu göndermeye istekli olmadığı değil - bunu zaten yapan bir büyük Silikon Vadisi şirketi ve birine ödeme yapmaktan memnuniyet duyacak bir başka şirket biliyorum yapmak ve kodu akışa almak için. Aksine, (gdb bakımcılarından biri olarak) bu şeylere bağlı bir adamla yapılan bir tartışmaya göre, gcc bakımcılarının bir felsefesi var: "Bir uyarı varsa, bu bir hatadır ve düzeltmeniz gerekir." Yani (imo) bu dini bir argüman ve onlar kazanmaları için kodu kontrol ediyorlar.
Bob Murphy

Bob'un yorumuna ek olarak, GCC geliştiricilerinin #pragmayönergeyi beğenmeme geçmişi vardır , bu nedenle GCC'ye özgü her şeyin bir __attribute__((foo)).
Tom

10
yeni gcc (> = 4.4), #pragma GCC push_optionsböylece sadece tanılamadan daha fazlasını karıştırabilirsiniz ... gcc.gnu.org/onlinedocs/gcc/…
Spudd86

33

Ben de benzer bir şey yaptım. Üçüncü taraf kodu için hiçbir uyarı görmek istemedim. Yani belirtmek yerine -I/path/to/libfoo/includekullandım -isystem /path/to/libfoo/include. Bu, derleyicinin uyarılar amacıyla ve etkinleştirmediğiniz sürece bu başlık dosyalarını "sistem üstbilgileri" olarak değerlendirmesini sağlar.-Wsystem-headers sürece çoğunlukla güvendesinizdir. Yine de oradan sızan birkaç uyarı gördüm, ancak çöplerin çoğunu azaltıyor.

Bunun yalnızca rahatsız edici kodu include-directory ile ayırabilirseniz size yardımcı olacağını unutmayın. Kendi projenizin sadece bir alt kümesiyse veya başka bir kodla karıştırılmışsa, şansınız kalmaz.


1
Harika bir ipucu. LLVM kullanıyorsanız, "Apple LLVM Derleyici - Dil" bölümündeki "Diğer C Bayrakları" altına -isystem bayrağını ekleyin.
Nestor

@Tom Paylaştığınız için teşekkürler. Çözümünüzü nerede kullanacağımı anlayamıyorum. Biraz daha söyleyebilir misin?
Lorenzo B

1

Bu, Matt Joiner'ın cevabının bir genişletmesidir .

Kodunuzun her yerinde pragma oluşturmak istemiyorsanız, _Pragma operatörünü kullanabilirsiniz :

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_PUSH
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

DIAGNOSTIC_POP
foo(a); // Error
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.