Kamu tidak bisa
Manual untuk GCC 4.4.0 hanya komprehensif untuk versi itu, tetapi ia mencantumkan semua peringatan yang mungkin untuk 4.4.0. Mereka tidak semua pada halaman yang Anda tautkan, misalnya beberapa opsi khusus bahasa ada pada halaman untuk opsi C ++ atau opsi Obj-C. Untuk menemukan semuanya, Anda lebih baik melihat Ringkasan Opsi
Menghidupkan semuanya akan termasuk -Wdouble-promotion
yang hanya relevan pada CPU dengan unit floating-point 32-bit presisi tunggal yang mengimplementasikan float
dalam perangkat keras, tetapi mengemulasi double
dalam perangkat lunak. Melakukan perhitungan seperti double
akan menggunakan emulasi perangkat lunak dan menjadi lebih lambat. Itu relevan untuk beberapa CPU tertanam, tetapi sama sekali tidak relevan untuk CPU desktop modern dengan dukungan perangkat keras untuk floating-point 64-bit.
Peringatan lain yang biasanya tidak berguna adalah -Wtraditional
, yang memperingatkan tentang kode yang dibentuk dengan sempurna yang memiliki arti berbeda (atau tidak berfungsi) dalam "string " "concatenation"
definisi fungsi C tradisional, misalnya , atau ISO C! Apakah Anda benar-benar peduli tentang kompatibilitas dengan kompiler berusia 30 tahun? Apakah Anda benar-benar menginginkan peringatan untuk menulis int inc(int i) { return i+1; }
?
Saya pikir -Weffc++
terlalu berisik untuk berguna, itu didasarkan pada edisi pertama Efektif C ++ yang sudah ketinggalan zaman dan memperingatkan tentang konstruksi yang benar-benar valid C ++ (dan untuk itu pedoman diubah dalam edisi buku selanjutnya.) Saya tidak ingin menjadi memperingatkan bahwa saya belum menginisialisasi std::string
anggota di konstruktor saya; ia memiliki konstruktor default yang melakukan persis apa yang saya inginkan, mengapa saya harus menulis m_str()
untuk memanggilnya? The -Weffc++
peringatan yang akan membantu terlalu sulit bagi compiler untuk mendeteksi secara akurat (memberikan negatif palsu), dan orang-orang yang tidak berguna, seperti menginisialisasi semua anggota secara eksplisit, hanya menghasilkan terlalu banyak kebisingan, memberikan positif palsu.
Luc Danton memberikan contoh yang bagus dari peringatan tidak berguna dari -Waggregate-return
yang hampir pasti tidak pernah masuk akal untuk kode C ++.
yaitu Anda tidak benar-benar menginginkan semua peringatan, Anda hanya berpikir Anda melakukannya.
Bacalah manual, baca tentang mereka, putuskan yang Anda mungkin ingin aktifkan, cobalah. Membaca manual kompiler Anda adalah Good Thing TM , mengambil jalan pintas dan mengaktifkan peringatan yang tidak Anda mengerti bukanlah ide yang sangat bagus, terutama jika itu untuk menghindari keharusan RTFM.
Siapa pun yang baru saja menyalakan segalanya mungkin melakukannya karena mereka tidak tahu apa-apa karena atau bos yang berambut runcing berkata "tidak ada peringatan."
Beberapa peringatan penting, dan beberapa tidak. Anda harus melakukan diskriminasi atau Anda mengacaukan program Anda. Pertimbangkan, misalnya -Wdouble-promotion
,. Jika Anda bekerja pada sistem tertanam Anda mungkin menginginkan ini; jika Anda bekerja pada sistem desktop Anda mungkin tidak. Dan apakah kamu mau -Wtraditional
? Aku meragukan itu.
Sunting: Lihat juga -Wall-all untuk mengaktifkan semua peringatan yang ditutup sebagai WONTFIX.
Sunting 2: sebagai tanggapan terhadap keluhan DevSolar tentang makefile yang perlu menggunakan peringatan berbeda tergantung pada versi kompiler, jika -Wall -Wextra
tidak cocok maka tidak sulit untuk menggunakan CFLAGS khusus-kompiler dan khusus-versi:
compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))