"G ++ -Wall test.cpp -o test" içindeki "-Wall" ne işe yarar?


92

-o çıktı dosya adını değiştirir (--help kullanarak buldum)

Ama ne olduğunu bulamıyorum -Wall?


7
Konsolunuzdaki "man gcc" size bu bayrakla ilgili her şeyi anlatır ve "gcc -Wall" ile basit bir Google araması da ...
David Sauter

Genel bir ipucu olarak, manbir anahtarın ne yaptığını veya hangi anahtarların mevcut olduğunu öğrenmek istiyorsanız programların girişlerini okumayı deneyin . manSayfa gccokunabilen linux.die.net/man/1/gcc - metin "-Wall" için hızlı bir arama var yapabileceği
gnud

6
@David Sauter, Google "-wall" ile hiçbir şey bulamayacak. Tüm "duvarı" aramadan çıkaracaktır.
Kirill V. Lyadvinsky 09

@Kirill Eğer alıntı kullanırsanız, David'in kastettiğini tahmin ettiğim gibi değil
gnud

1
//, hep Larry Wall'a bir saygı duruşu olduğunu düşünmüşümdür.
Nathan Basanese

Yanıtlar:


110

"Hepsini uyar" ın kısaltması - g ++ 'nın size söyleyebileceği (neredeyse) tüm uyarıları açar. Genelde iyi bir fikir, özellikle de yeni başlayan biriyseniz, çünkü bu uyarıları anlamak ve düzeltmek, kodunuzdaki birçok farklı türde sorunu çözmenize yardımcı olabilir.


24
(Ki bazıları oldukça yararlıdır) Daha uyarıları ile açılabilir -Wextrave -pedantic.
gnud

7
Hepsi (neredeyse) değil. Aslında mevcut uyarıların sadece çok küçük bir kısmı. "Herkesin" hemfikir olduğu şeyler. Gerçekten iyi bir fikir yapmaktır -Wall -Wextrave sonra elle incelemek birçok olarak bulmak için daha bile, çünkü mümkün olduğunca olanak verebilir uyarılar -Wextra... sadece küçük bir alt kümesidir
DevSolar

@DevSolar çok güzel bir nokta. "Kelimenin tam anlamıyla tüm uyarılar" anlamına gelen bir bayrak olup olmadığını biliyor musunuz ?
MatrixFrog

1
@MatrixFrog: Ne yazık ki böyle bir seçenek yok, en azından bildiğim derleyiciler için. Ve mevcut uyarıların listesi zamanla değişiyor ... GCC ekibi -Wunreachable-codebir süre önce devre dışı bırakmasaydı , Apple bugünlerde çok daha mutlu olurdu . ;-)
DevSolar

36

Man gcc'ye bakın.

-Wall şu uyarıları açar :

-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts
-Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and
 Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) 
-Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) 
-Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type 
-Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing 
-Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas 
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable 
-Wvolatile-register-var

-Wextra şunları içerir:

-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers
-Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init
-Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused
 or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)

Açıkça açmanız gereken daha birçok uyarı var.

Örneğin, kullandığımız C kodumuz için:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimizasyon -Wdiv-by-zero -Wendif-etiketleri -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = eksik-parantez -Wmissing-bildirimleri -Wno-eksik-format-özniteliği -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-türü -Sıra-noktası -Wsign-karşılaştırma -Kısıtlı-aliasing -Kısıtlı-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-kullanılmayan -Wvariadic-makrolar -Write-dizeleri -Wc ++ -compat -Werror = ifade-sonrası-bildirim -Werror = örtük-fonksiyon-bildirimi -Wmissing-prototipleri -Werror = iç içe-dışlar -Werror = eski-stil-tanım -Werror = katı-prototipler

veya yalnızca https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html ile uyarılar kümesi


19

Ne yazık ki cevapların hiçbiri kılavuzun gerçekte ilgili kısmından alıntı yapmıyor, bu da onu gerçekten bir noktaya getiriyor:

Bu, bazı kullanıcıların şüpheli olduğunu düşündüğü ve makrolarla birlikte bile kaçınılması (veya uyarıyı önlemek için değiştirilmesi) kolay olan yapılarla ilgili tüm uyarıları etkinleştirir.

[...]

Bazı uyarı bayraklarının ile ima edilmediğini unutmayın -Wall. Bazıları, kullanıcıların genellikle şüpheli olarak görmedikleri, ancak bazen kontrol etmek isteyebileceğiniz yapılar konusunda uyarıyor; diğerleri bazı durumlarda kaçınılması gereken veya kaçınılması zor olan yapılar hakkında uyarır ve uyarıyı bastırmak için kodu değiştirmenin basit bir yolu yoktur. Bazıları tarafından etkinleştirilmiştir, -Wextra ancak çoğunun ayrı ayrı etkinleştirilmesi gerekir.

Ergo:

  • -Wallyok değil "tüm uyarıları" demek.
  • Ayrıca gelmez değil , değil uzun bir atış "Tüm (neredeyse)" anlamına gelir.
  • Bu vermez bireysel seçenekleri kümesi anlamına değiştirmek bağlıdır .

Sonuç olarak, ayarlamanız gereken mutlak minimum uyarılarla ilgilidir. Daha -Wall -Wextraiyi olsa da, derleyicinizin sizin için yapabileceği tüm hataları kontrol etmiyor.


Şahsen ben daha azına gitmezdim -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. Mevcut tüm projelerim aslında bundan daha uzun bir uyarı listesi kullanıyor (hiçbirini tetiklemeden). Ve yeni seçenekler için her büyük sürümdeki kılavuzu kontrol ediyorum. Derleyici arkadaşınızdır. Size sunabileceği teşhisleri kullanın.


C ++ kullanarak programlamayı öğrenmeye başladım. Programlama ilkelerini kullanıyorum ve cpp kullanarak alıştırma yapıyorum . Sistemim 16.04 ubuntu, editörüm olarak vscode kullanıyorum. C ++ ve programlamayı öğrenirken -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualderlerken kendi kendimi kullanmamı önerir misin g++ -std=c++11? Yoksa bu bölümü atlayıp daha sonra hata mesajı bayraklarını kullanmaya mı başlamalıyım? Eğer öyleyse, hata mesajlarına ne zaman başlamalıyım?
scientific_explorer

2
@vkv: Derleyicinin gerçekten arkadaşınız olduğuna inanıyorum ve size verebileceği her küçük iyi tavsiyeden yararlanmalısınız.
DevSolar


2

O enables most warning messages.

Kullanırsanız daha fazlasını öğrenebilirsiniz g++ --help=warnings.


0

Tüm uyarıları etkinleştirir. ("Tümü Uyarı" olarak okunur)


Aslında etkinleştirmediği pek çok uyarı vardır (sanal yöntemlerle bir sınıfta sanal olmayan dtor gibi).
Mark B

Yuval'ın cevabına bakın: -Wall"tüm uyarılar" yerine "çoğu uyarı" anlamına gelir.
HaxtraZ

-1

Tüm uyarıları gösterir. -pedanticKodun bazı uyumlu olmayan kısımları hakkında uyarmak için de kullanmanızı tavsiye ederim .


Gcc doc için: "Bazı kullanıcılar programları katı ISO C uygunluğu açısından kontrol etmek için -pedantic'i kullanmaya çalışıyorlar. Kısa süre sonra bunun tam olarak istediklerini yapmadığını fark ettiler: bazı ISO dışı uygulamaları bulur, ancak hepsini bulmaz - yalnızca ISO C, bir tanılama ve tanılama eklenmiş bazılarını gerektirir. "
AProgramcı

% 100 garanti vermiyor ama yardımcı oluyor.
Kirill V. Lyadvinsky

1
Eğer yazılı olmasaydı bazı yerine tüm "hakkında uyarmak için de tüm olmayan uyumlu parçalar", ben yorumladı olmazdı. Ancak mevcut formülasyonunuz gcc belgelerinin uyardığı yanlış anlayışı yaydı.
AProgramcı

Sabit. Ancak pratikte bu daha ziyade "çoğu" gibi görünüyor, "bazıları" değil.
Kirill V. Lyadvinsky 09
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.