Neden biri derleyici uyarılarını devre dışı bırakmak istesin ki?


26

Bu cevap ve eklenen yorumlar, derleyici kullanarak birkaç derleyici uyarısını etkisiz hale getirmenin bir yolunu gösterir #pragma.

Neden biri bunu yapmak istesin ki? Genelde uyarılar bir sebep için vardır ve her zaman onların iyi sebepler olduğunu hissettim. Uyarıların devre dışı bırakılması gereken herhangi bir "geçerli durum" var mı? Şu an hiçbir şey düşünemiyorum, ama belki de sadece benim.


4
Birisinin bunu neden kapattığı için emin değilim. Bana son derece makul bir soru gibi görünüyor. +1

@Alastair Pitts: Programcılara göç teklif ettim. Hatamı daha sonra anladım.
Tugrul Ateş

3
Uyarı mesajları bir sebepten dolayı var, fakat aynı zamanda hata mesajı olmadıklarının da bir nedeni var .
Solomon Yavaş

2
@jameslarge Yorumunuz durumu iyi özetliyor. Bir uyarı derleyici size bir durumun yanlış olduğunu ve bunun da muhtemelen doğru olduğunu ima ettiğini söyler . Eğer öyle olsaydı kesinlikle yanlış o zaman bir hata olacaktır. Bazı uyarılar yanlış pozitif olabileceğinden, her zaman uyarıyı ortadan kaldıracak şekilde kod yazmanın bir yolu olmalıdır. Ne yazık ki, bazen bunu yapmanın en pratik yolu bir pragmadır; dolayısıyla adı.
Eric Lippert

Sakat değil, saklanıyor. Sorun hala orada olmayacak, onu göremeyeceğin gibi olacak
Sisir,

Yanıtlar:


11

Bir uyarıyı etkisiz hale getirdiğim tek bir durum oldu. Uyarı hatalarını dikkate alıyorum, bu yüzden normalde uyarılarla serbest bırakmam. Bununla birlikte, bir müşteride bir API geliştirirken, bir uygulamada geçiş aşamasında ihtiyaç duyulan bir yöntemin ve hiç bir zaman kullanmaması gerekenin kütüphaneye dahil edilmemesi sorunuyla karşılaştım.

API'nin tüm kullanıcılarına bu yöntemi çağırmamaları gerektiğini söylemenin en iyi yolu, eski olduğunu işaretlemekti. Bununla birlikte, geçerli bir kullanım durumunun derleme uyarısı olarak işaretlenmiş olması anlamına geliyordu.

Eric Lippert, derleyici ekibinin uyarılar hakkında nasıl düşündüğü hakkında bilgi bulabileceğiniz uyarılar hakkında birkaç yazı yazdı.

Dahili türlerin iç alanları

Kullanılmayan direktifler uyarılarla işaretlenmez


10

Belgelerin neden devre dışı bırakmak isteyebileceğinize nedenleri verdiği birkaç uyarı:

Diğer örnekler, eski yöntemi kullanmak istediğinizi veya yerel olarak hiç okunmamış, ancak bunun yerine yansıması olan özel üyelere sahip olmak istediğinizi biliyorsanız, amortismana tabi tutulmuş yöntemleri kullanma konusunda uyarılar içerir.

Tecrübelerime göre C #, uyarıları devre dışı bırakmak için C ++ gibi diğer dillerden daha az ihtiyaç duyuyor. Bu büyük ölçüde çünkü Eric Lippert’in blogunda dediği gibi “kodun kırıldığı, yanıltıcı veya yararsız olduğu konusunda neredeyse kesin olarak söyleyebileceğimiz durumlar için uyarılar bırakmaya çalışıyorlar”.


3
Güzel. Birincisinin en net olduğunu düşünüyorum, çünkü çok özel bir durum ve bir gerekçe sunuyor (örneğin, üçüncü, ekibim üzerinde hiçbir zaman gözden geçirmeyecek bir kod kümesi gösteriyor). Bu soru eski / kısıtlanmış uyarılardan bahsediyor. Temel olarak, hala eski kodda ihtiyaç duyulur, ancak herhangi bir yeni kodu kullanmaktan vazgeçirmek istersiniz. Eski kod uyarıları bastırmalı.
Greg Jackson

Excel programında çok fazla makro programlama yaptım ve otomatik kaydetme, otomatik çıkış, bildirimler, vb. Gibi çeşitli nedenlerle uyarıları devre dışı bırakmak zorunda kaldım. Tabii ki bu uyarılarla ilgili olmayabilir ...
Dave Mess

@ICR Java'da derleyici uyarılarını devre dışı bırakmayı hiç hatırlamıyorum. Tek yaptığım kullanımdan kaldırılmış yöntemler kullanmaktan kaçınmak.
Mahmoud Hossam

@Mahmoud Kendimi sık sık, jeneriklerle uzaktan bile karmaşık bir şey yaparken "denetlenmeyen" uyarıları bastırmak zorunda kalıyorum. Ancak Java'yı C ++ ile saçma uyarılar cephesinde almak büyük olasılıkla haksızlık - cevabımı düzenledi.
ICR

@ICR Java, koleksiyonlarda tip güvenliği sağlamak için jenerik kullanımı zorlar, bazıları bunu bir kısıtlama olarak görür, bir özellik olarak düşünüyorum, kod yazmayı biraz acı verici hale getirir, ancak hayat kurtarır ve evet, C ++ derleyici çıktısı oluşturur. STL veya şablonlarla ilgili bir şey olduğunda biraz korkutucu.
Mahmoud Hossam

8

C cinsinden düzenli olarak değişkenlerle karşılaştığım bir örnek:

int doSomething(int argument1)
{
#ifdef HARDWARE_TYPE_A
    performAction(argument1);
#else
    displayNotSupportedMessage();
#endif
}

Argüman sadece bazı platformlarda geçerlidir, fakat konuyla ilgisi olmadığı durumlarda derleyicim şikayetçi olur ve hatalara dönüştürülen uyarılar bulunduğundan, bu durumun oluşmasını engeller.

Uyarıları hatalara dönüştürmek, "bu değil, bu durumda derleyiciden daha iyi bilirim" için bir kaçış kapısı gerektirir.


6

Pek çok vazgeçilmez Java kütüphanesi, güvenli olmayan tipografi gereksinimini ortadan kaldırmak için hiçbir zaman güncellenmedi. Diğer uyarıların fark edilip düzeltilmesi için bu uyarıların bastırılması zorunludur.


5

Gömülü çalışmaları yapıyorum ve uyarıları devre dışı bıraktığım bir ya da iki zamanı hatırlıyor gibiyim, çünkü derleyiciye yararsız görünen, ancak gerçekte donanımda gerçek dünya etkileri olan bir şey yapıyordum.

Diğer tek zaman, bazı veri yapıları hakkında farklı fikirlere sahip kod tabanları üzerinde çalışırken (bayt dizilimi - char veya imzasız karakter dizileri nasıl gösterileceği gibi). Bu durumlarda, uyarıları etkisiz hale getirebilirim çünkü alternatif, gün boyunca kodu geçerek ve bir kısmı değiştirerek ya da yüzlerce parantez koyarak geçirmektir.


3

En iyi uygulamalar için çaba sarf eden projeler için bile, derleyici uyarılarını seçici olarak devre dışı bırakmak için birkaç neden vardır.

  • Farklı Derleyiciler (veya aynı derleyicilerin farklı sürümleri) :
    Derleyiciler inceliklerini farklı şekillerde ele alır. Diğer derleyicileri etkilemeyen yanlış pozitif uyarılar vermek. Bu durumda, yalnızca belirli derleyicileri etkileyen, özellikle de sonunda desteklenmeyen eski derleyiciler için yanlış-pozitif bir uyarıyı susturmak için geçerli kodu düzenlemek yerine, bu derleyiciler için uyarının devre dışı bırakılması mantıklı olabilir.
  • Oluşturulan kodla:
    Kod hijyeni ile ilgili bazı uyarılar (ölü kod, koşullu ifadelerin yinelenen gövdesi, tür limitlerini aşan karşılaştırmalar), zararsız oldukları ve derleyici bunları en iyi duruma getireceği için güvenle yoksayılabilir.
    Bu zararsız uyarıları yükseltmeyen bir kod üretmek elbette de bir seçenektir, ancak değerinden daha fazla sorun olabilir.
  • Harici kod için uyarılar:
    Belki de projenize dahil edilmiş olan iyi bilinen bir qsort veya md5 sağlama toplamı uygulaması kullanıyorsunuzdur. Kod birçok proje tarafından kullanılır ve iyi çalıştığı bilinmektedir, ancak normalde kendi kodunuz için doğru olan bazı seçici uyarılar olabilir.
    Bununla birlikte, harici kod için, yalnızca kesinlikle zararsız olduğu varsayılarak uyarıyı devre dışı bırakmak daha az güç olabilir .
  • Sistem başlıklarının neden olduğu uyarılar:
    Örneğin GCC / Clang desteklese de -isystem, sistem başlıklarındaki farklılıkların ihmal edilebilecek uyarılara neden olduğu durumlar olabilir (belki de bir fonksiyonun bir sistemde işaretli bir dönüş değeri vardır, ancak -Wsign-compareuyarıları tetikler) .
    Başka bir durum, sistem başlıklarında tanımlanan makrolar olabilir, onları değiştirmek için makroları kendi kodunuza kopyalayıp yapıştırabilirsiniz, ancak her şeyin 3. parti kütüphanelerden makroları korumak konusunda endişelenmemesi gerektiği düşünülür ... uyarıyı susturmak (belki de makro -Wsign-conversionörneğin bir alçıya neden olmaz ).
  • Saplama kodunda kullanılmayan uyarılar:
    Kullanılmayan parametrelere karşı uyarırsınız, ancak kitaplığın tamamını yalnızca saplama işlevlerini içeren tek bir dosyada çıkarırken - (void)arg1; (void)arg2; (void)arg3; ...her saplama işlevinin gövdesini zorlamakta faydası yoktur .
    Sadece -Wunused-parameterbu durumda bastırmak daha iyi .

Bütün bu örneklerde, onun uyarılarını devre dışı gerçek hataları gizlemek için gitmiyor varsaydıkları bu Not örn: -Wredundant-decls, -Wunused-parameter, -Wdouble-promotion, belki -Wpedantic... ve ne yaptığınızı biliyorum!


2

Geçerli veya değil, bazen derleme sunucusundaki "uyarıları hata olarak kabul et" direktifini atlamak için yapılır.

Bunun dışında hiçbirini düşünemiyorum. Engelliler uyarılar genellikle "çirkin bir hax" işaretidir


2

En son bazı uyarıları etkisiz hale getirdiğimizde, bir stajyer bizi kötü kodla terk ettiğinden dolayıydı. Çok daha iyi çalışmasını sağladım, belirsiz dönüşüm sınırları, belirsiz veri sunumunun yerini aldı.

Bu arada, onu derlememiz gerekiyordu ve “uyarılar hata” seçeneğini istiyorduk, bu yüzden bazı uyarıları bastırdık.


2

Şu anda, hiç görmezden geldiğim tek uyarı

  warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)  

Çünkü microsoft, C ++ belirtimini uygulamıyor (belgeler bile yapmadığını söylüyor!) Ve işlevlerin belirli atışları bildirmesine izin veriyor ve tüm işlevler yalnızca ya atmak () ya da atmak (...), yani hiçbir şey ya da her şey olabilir.

HelpViewer 1.1'den:

 A function is declared using exception specification, which Visual C++ accepts but does not implement. Code with exception specifications that are ignored during compilation may need to be recompiled and linked to be reused in future versions supporting exception specifications. 
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.