Apa yang dilakukan "-Wall" dalam "g ++ -Wall test.cpp -o test"?


92

-o mengubah nama file keluaran (saya menemukan itu menggunakan --help)

Tapi saya tidak tahu apa yang -Walldilakukannya?


7
"man gcc" di konsol Anda memberi tahu Anda segalanya tentang bendera ini dan penelusuran Google sederhana dengan "gcc -Wall" juga ...
David Sauter

Sebagai tip umum, cobalah membaca manentri untuk program jika Anda ingin tahu apa yang dilakukan sakelar, atau sakelar apa yang tersedia. The manhalaman gccdapat dibaca pada linux.die.net/man/1/gcc - Anda dapat melakukan pencarian cepat di sana untuk teks "Wall"
gnud

6
@David Sauter, Google tidak akan menemukan apa pun dengan "-wall". Ini akan mengecualikan semua "dinding" dari pencarian.
Kirill V. Lyadvinsky

@Kir Tidak jika Anda menggunakan tanda kutip, seperti saya menebak maksud David
gnud

1
//, Saya selalu berpikir itu adalah penghormatan kepada Larry Wall.
Nathan Basanese

Jawaban:


110

Ini adalah kependekan dari "warn all" - ini menyalakan (hampir) semua peringatan yang dapat diberitahukan oleh g ++ kepada Anda. Biasanya ide yang bagus, terutama jika Anda seorang pemula, karena memahami dan memperbaiki peringatan tersebut dapat membantu Anda memperbaiki berbagai jenis masalah dalam kode Anda.


24
Lebih banyak peringatan (beberapa di antaranya sangat berguna) dapat diaktifkan dengan -Wextradan -pedantic.
gnud

7
Tidak (hampir) semuanya. Ini sebenarnya hanya sebagian kecil dari peringatan yang tersedia. Itu yang disetujui "semua". The benar-benar ide yang baik adalah untuk melakukan -Wall -Wextra, dan kemudian membaca dengan teliti manual untuk menemukan banyak lebih peringatan Anda bisa mengaktifkan mungkin, karena bahkan -Wextrahanya bagian kecil ...
DevSolar

@Devolar poin yang sangat bagus. Tahukah Anda jika ada bendera yang berarti "secara harfiah semua peringatan"?
MatrixFrog

1
@MatrixFrog: Sayangnya, tidak ada opsi seperti itu, setidaknya tidak untuk kompiler yang saya tahu. Dan daftar peringatan yang tersedia berubah seiring waktu ... jika tim GCC tidak menonaktifkan -Wunreachable-codebeberapa waktu lalu, Apple akan jauh lebih bahagia hari ini. ;-)
DevSolar

36

Lihat man gcc.

-Dinding menyalakan peringatan ini:

-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 berisi:

-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)

Masih banyak lagi peringatan yang harus Anda aktifkan secara eksplisit.

Misalnya untuk kode C kami, kami menggunakan:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = tanda kurung hilang -Wmissing-declarations -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-bandingkan -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macros -Write-strings -Wc ++ -compat -Werror = declaration-after-statement -Werror = implicit-function-declaration -Wmissing-prototypes -Werror = nested-externs -Werror = old-style-definition -Werror = strict-prototypes

atau hanya sekumpulan peringatan dengan https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html


19

Sayangnya tidak ada jawaban yang mengutip bagian manual yang benar-benar relevan, yang benar-benar membawanya ke suatu titik:

Hal ini memungkinkan semua peringatan tentang konstruksi yang oleh beberapa pengguna dianggap meragukan, dan yang mudah dihindari (atau dimodifikasi untuk mencegah peringatan), bahkan dalam hubungannya dengan makro.

[...]

Perhatikan bahwa beberapa tanda peringatan tidak diimplikasikan oleh -Wall. Beberapa dari mereka memperingatkan tentang konstruksi yang umumnya tidak dianggap meragukan oleh pengguna, tetapi terkadang Anda mungkin ingin memeriksanya; yang lain memperingatkan tentang konstruksi yang perlu atau sulit dihindari dalam beberapa kasus, dan tidak ada cara sederhana untuk mengubah kode untuk menyembunyikan peringatan. Beberapa di antaranya diaktifkan oleh -Wextra tetapi banyak di antaranya harus diaktifkan secara individual.

Jadi:

  • -Walltidak tidak berarti "semua peringatan".
  • Ini juga tidak berarti "(hampir) semua", tidak terlalu jauh.
  • Ini tidak berarti satu set pilihan individu yang terikat untuk mengubah .

Intinya, ini tentang peringatan minimum absolut yang harus Anda tetapkan. Meskipun -Wall -Wextralebih baik, itu masih belum memanfaatkan semua pengecekan kesalahan yang dapat dilakukan kompiler Anda untuk Anda.


Secara pribadi saya tidak akan pergi kurang dari -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. Semua proyek saya saat ini sebenarnya menggunakan daftar peringatan yang lebih panjang dari itu (tanpa memicu salah satu pun). Dan saya memeriksa manual pada setiap rilis utama untuk opsi baru. Kompilator adalah teman Anda. Gunakan diagnostik apa pun yang ditawarkannya kepada Anda.


Saya sudah mulai belajar pemrograman menggunakan C ++. Saya menggunakan prinsip-prinsip pemrograman dan berlatih menggunakan cpp . Sistem saya adalah ubuntu 16.04, saya menggunakan vscode sebagai editor saya. Apakah Anda merekomendasikan saya untuk menggunakan Anda -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualsaat saya mengkompilasi g++ -std=c++11sementara saya belajar c ++ dan pemrograman? Atau haruskah saya melewati bagian ini dan mulai menggunakan bendera pesan kesalahan nanti? Jika demikian, kapan saya harus mulai dengan pesan kesalahan?
scientific_explorer

2
@vkv: Saya percaya bahwa kompilator benar-benar adalah teman Anda, dan Anda harus memanfaatkan setiap nasihat bagus yang dapat diberikannya.
DevSolar


2

Itu enables most warning messages.

Anda dapat mengetahui lebih lanjut jika Anda menggunakan g++ --help=warnings.


0

Ini memungkinkan semua peringatan. (dibaca sebagai "Peringatkan Semua")


Sebenarnya ada banyak peringatan yang tidak diaktifkannya (seperti dtor nonvirtual di kelas dengan metode virtual).
Mark B

lihat jawaban Yuval: -Wallhanya berarti "sebagian besar peringatan" daripada "semua peringatan".
HaxtraZ

-1

Ini menunjukkan semua peringatan. Saya juga merekomendasikan penggunaan -pedanticuntuk memperingatkan tentang beberapa bagian kode yang tidak sesuai.


Untuk gcc doc: "Beberapa pengguna mencoba menggunakan -pedantic untuk memeriksa program untuk kesesuaian ISO C yang ketat. Mereka segera menemukan bahwa ia tidak melakukan apa yang mereka inginkan: ia menemukan beberapa praktik non-ISO, tetapi tidak semua — hanya yang itu ISO C membutuhkan diagnostik, dan beberapa lainnya yang telah ditambahkan diagnostiknya. "
Pemrogram

Itu tidak memberikan jaminan 100%, tapi itu membantu.
Kirill V.Lyadvinsky

1
Jika Anda tidak menulis beberapa, bukan semua di "untuk memperingatkan tentang semua bagian yang tidak sesuai", saya tidak akan berkomentar. Tetapi formulasi Anda saat ini hanya menyebarkan kesalahpahaman yang diperingatkan oleh dokumentasi gcc.
Pemrogram

Tetap. Namun dalam praktiknya, ini terlihat seperti "sebagian besar" dan bukan "sebagian".
Kirill V. Lyadvinsky
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.