Soru C / C ++ derleyiciler için en iyi derleyici uyarı seviyesi?


Farklı C / C ++ derleyicileri için hangi derleyici uyarı seviyesini önerirsiniz?

gcc ve g ++ varsayılan düzeyde çok şeyden uzaklaşmanıza izin verecektir. Benim için en iyi uyarı seviyesini buldum '-Wall'. Ve her zaman oluşturduğu uyarılar için kodu düzeltmeye çalışıyorum. (Mantıksal öncelik kuralları için parantez kullanmakla ilgili aptalcalar bile ya da gerçekten "if (x = y) ') demek istiyorum.

Sun CC, aCC (HPUX?), Visual Studio, intel gibi farklı derleyiciler için favori seviyen nelerdir?

Düzenle:

Ben sadece gcc / g ++ üzerinde "-Werror" (ama bunun faydasını anlıyorum) kullanmadığımı belirtmek istedim çünkü kullanıyorum:

#warning "bu kendime bir nottur"

kodumda birkaç yerde. Tüm derleyiciler #warning makasını anlıyor mu?


44
2017-12-30 09:22


Menşei


#warning standart dışıdır; Bence #error oldukça evrenseldir. - Mikeage


Cevaplar:


Bu, C ++ kodu için kullanıyorum ekstra paranoyak bayrakları kümesidir:

    -g -O -Wall -Weffc++ -pedantic  \
    -pedantic-errors -Wextra -Waggregate-return -Wcast-align \
    -Wcast-qual  -Wchar-subscripts  -Wcomment -Wconversion \
    -Wdisabled-optimization \
    -Werror -Wfloat-equal  -Wformat  -Wformat=2 \
    -Wformat-nonliteral -Wformat-security  \
    -Wformat-y2k \
    -Wimplicit  -Wimport  -Winit-self  -Winline \
    -Winvalid-pch   \
    -Wunsafe-loop-optimizations  -Wlong-long -Wmissing-braces \
    -Wmissing-field-initializers -Wmissing-format-attribute   \
    -Wmissing-include-dirs -Wmissing-noreturn \
    -Wpacked  -Wpadded -Wparentheses  -Wpointer-arith \
    -Wredundant-decls -Wreturn-type \
    -Wsequence-point  -Wshadow -Wsign-compare  -Wstack-protector \
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch  -Wswitch-default \
    -Wswitch-enum -Wtrigraphs  -Wuninitialized \
    -Wunknown-pragmas  -Wunreachable-code -Wunused \
    -Wunused-function  -Wunused-label  -Wunused-parameter \
    -Wunused-value  -Wunused-variable  -Wvariadic-macros \
    -Wvolatile-register-var  -Wwrite-strings

Bu size başlamak için bir şey vermeli. Bir projeye bağlı olarak, üçüncü taraf kitaplıklarından gelen uyarıları görmemek için sesi hafifletmeniz gerekebilir (bu durum genellikle ücretsiz uyarı konusunda oldukça dikkatsizdir.) Örneğin, Vektör / Matris kodu artırma g ++ öğesini çok fazla yayar. Gürültü

Bu gibi durumlarla başa çıkmanın daha iyi bir yolu, g ++ 'ya kadar olan ve hala belirli dosyalar / satır numaraları için görülmesini engellemeye izin veren uyarıları kullanan bir paketleyici (g ++) yazmaktır. Uzun zaman önce böyle bir araç yazdım ve bunu temizlemek için zamanım olduğunda onu serbest bırakacağım.


45
2017-12-30 19:47



Birisi gcc'ye özgü benzer bir soru sordu ve bu gönderiye başvuruldu. Yinelenen uyarıları kaldırmak için bu cevabı güncelledim (örneğin, -Wformat = 2 ima -Wformat-y2k). Görmek: stackoverflow.com/a/9862800/852254 - David Stone
g ++ ile oluşturulmaz -WimplicitC / ObjC özgüdür. - Francisco de la Peña
Burada fazlalık var gibi görünüyor. Örneğin (en azından GCC’de) -Wall ima -Wunused. Ayrıca, bu cevap bayrakları daha iyi açıklamanız daha iyi olurdu. - Lii


Visual C ++ üzerinde kullanıyorum /W4 ve /WX (uyarıları hata olarak ele alın).

VC ayrıca /Wallama standart başlıklarla uyumsuz.

Uyarıları hata olarak kabul etmeyi seçiyorum çünkü bu beni düzeltmeye zorluyor. Tüm uyarıları düzeltirim, bu ekleyerek demek olsa bile #pragma uyarıyı görmezden gelmek için - bu şekilde, açıkça belirtiyorum, uyarının farkındayım (diğer geliştiriciler bana bu konuda e-posta göndermeyecek).


24
2017-12-30 09:32



Dikkat etmediğimiz belirli uyarılara ve her şey hakkında temiz bir derleme (uyarı yok) politikamız var. - David Thornley


VC'nin de desteklediğine inanıyorum

#pragma message ("note to self")

Ancak, sistem büyüdükçe ve büyüdükçe ve bir gece inşa edip 30 geliştiricinin eşzamanlı olarak çalışmasını sağladığımızda, tüm notaları kendi kendine okumaları zaman alır. Stres altında kalmak, yetişememek ve istifa etmek zorunda kalmak ...

Hayır, izin verirseniz uyarı miktarı hızla büyüyecek ve gerçekten önemli olanları (başlatılmamış değişkenler, kurucuda kullanılan bu işaretçi ...) fark edemeyeceksiniz.

Bu yüzden uyarıları hata olarak ele almaya çalışıyorum: çoğu zaman derleyici doğru uyarı veriyor ve eğer değilse, kodu belgede belgeleyip hazırlıyorum.

#pragma warning ( push )
#pragma warning ( 4191 : disable )
// violent code, properly documented
#pragma warning ( pop )

ben sadece oku Onlar bir .. sahip warning ( N : suppress ) pragma da.


13
2017-12-30 09:59





Kullanmaya eğilimliyim -Wall (çünkü herkes hata yapar, kimse mükemmel değildir), ama kullanmıyorum -Werror (uyarıları hata olarak kabul edin) çünkü şimdi ve sonra gcc, her halükarda (yanlış pozitif) olan şeyleri uyarır.


9
2017-12-30 09:24



Yani, eğer gcc sana 100 uyarı atarsa, derlediğin zaman onları gözden geçirir misin? Aksi halde, yanlış pozitiflerin yığınına gömülen gerçek uyarılarla nasıl başa çıktığını anlamıyorum ... - Paulius
Burada açıklanan teknikleri kullanarak esnek / bizon uyarıları etrafında çalışabilirsiniz: wiki.services.openoffice.org/wiki/Writing_warning-free_code - codelogic
Paulius, eğer bana 100 uyarı atarsa, bunları düzelteceğim için endişelenmenize gerek yok sadece birkaç uyarı kaldım. İyi kütüphaneler kullanmak, uyarı mesajları içeren sayfaların oluşturulmasını mümkün kılar. Ayrıca, ne codelogic diyor ki: onları öldürdüğüm düzenli "uyarı öldürme" aşamaları var :) - Johannes Schaub - litb
kullanırım -W (diğer adıyla -Wextra) ek olarak -Wall Özellikle yazım hataları ve unutulmuş kod yolları nedeniyle bazı ekstra uyarıları yakaladığından (oops, bir şeyleri geri çevirmeyi unuttum!). Derleme aşamasında aptalca böcekleri yakalamada gerçekten yardımcı oluyor. - strager
her halükarda, tüm uyarıları etkinleştirmenin daha iyi olduğunu düşünüyorum, sadece birkaç tane etkinleştirin ama -Werror'ı etkinleştirin, çünkü aksi halde biri hatasız bir şekilde derleyemezdi. ama bu oldukça öznel bir konu gibi görünüyor :) - Johannes Schaub - litb


Her zaman kullanmak için litb katılıyorum -Wall. Ayrıca, kodunuzun uyumlu olmasını sağlamak istiyorsanız -pedantic'i de kullanabilirsiniz. Bayt seviyesinde sendika ve yapıları ele alırsanız yardımcı olabilecek bir başka uyarı ise -Wpadded.


8
2017-12-30 09:34





Hataları açıkken Uyarı ile tüm gelişmeyi yapıyorum.

VC6'da geliştirdiğimden beri, kodumda # pragma'nın çok var (esas olarak 4786).


4
2017-12-30 11:04





Burada GCC için güzel bir seçenek listesi var: http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm. -Hep olası tüm uyarıları etkinleştirmez ve bazıları açık bir şekilde etkinleştirilmelidir.


3
2017-12-30 11:17



Daha da iyisi, GCC el kitabına bakınız: gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html - strager