Bagaimana cara menyembunyikan peringatan GCC dari header perpustakaan?


126

Saya memiliki proyek yang menggunakan perpustakaan log4cxx, boost, dll. Yang headernya menghasilkan banyak peringatan (berulang). Apakah ada cara untuk menyembunyikan peringatan dari library include (mis. #Include <some-header.h>) atau include dari jalur tertentu? Saya ingin menggunakan -Wall dan / atau -Wextra seperti biasa pada kode proyek tanpa adanya info relevan yang dikaburkan. Saat ini saya menggunakan grep untuk membuat keluaran tetapi saya ingin sesuatu yang lebih baik.

Jawaban:


127

Anda dapat mencoba untuk memasukkan header perpustakaan menggunakan -isystembukan -I. Ini akan menjadikannya "header sistem" dan GCC tidak akan melaporkan peringatan untuk mereka.


11
Jika Anda mencoba melakukan ini di XCode, tempelkan jalur sistem ke "tanda C ++ lainnya" di "tanda compiler kustom" di setelan build target Anda.
Matt Parkins

3
Salah satu potensi kerugiannya adalah bahwa pada beberapa platform, g ++ akan secara otomatis memasukkan header sistem apa pun extern "C", yang menyebabkan kesalahan ganjil tentang tautan C jika Anda #includemenggunakan header C ++ di -isystemjalur.
Tavian Barnes

1
+1 membantu saya memecahkan masalah dengan peringatan peningkatan yang mengganggu stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom

3
Mengapa ini memiliki lebih banyak suara daripada jawaban OP sendiri yang mengatakan hal yang persis sama 1,5 jam sebelumnya?
underscore_d

1
Untuk Xcode: Bagaimana jika tidak ada path folder di "Other C ++ flags" di setelan build target saya? Bisakah seseorang menguraikan solusi ini?
Ossir

107

Bagi mereka yang menggunakan CMake, Anda dapat mengubah include_directoriesarahan Anda untuk menyertakan simbol SYSTEMyang menekan peringatan terhadap header tersebut.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^

Bagaimana jika perpustakaan menyediakan ${LIBFOO_USE_FILE}variabel yang akan digunakan dengan perintah include () CMake ?
waldyrious

2
Ini sepertinya hampir menjadi solusi untuk masalah saya. Saya memiliki 1.) target biner, yang bergantung pada 2.) target hanya header yang ditulis sendiri, yang bergantung pada 3.) beberapa pustaka eksternal. Saya tidak tahu cara mendapatkan peringatan untuk 1 & 2 saja. Anda punya ide?
knedlsepp

2
Sepertinya tidak berhasil. Saya mencoba ini dengan proyek yang menggunakan easylogging++dan saya mendapatkan sejumlah besar peringatan yang sama dari easylogging++.hmeskipun folder tempatnya berada telah disertakan dengan SYSTEMopsi.
rbaleksandar

Terima kasih BANYAK untuk ini. Itu telah menyelamatkan saya dari halaman dan halaman peringatan.
Svalorzen

1
Komentar yang sama untuk jawaban yang diterima: ini adalah praktik buruk bagi saya.
Raffi

55

Anda bisa menggunakan pragma. Sebagai contoh:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop

3
Hanya tersedia dengan GCC> = 4.6
Caduchon

1
Saya menyukai kemampuan pragma push / pop. saya ingat sesuatu seperti untuk java tersedia bertahun-tahun yang lalu dan menjadi frustrasi / iri untuk C / C ++. Saya suka ini tersedia digcc
Trevor Boyd Smith

@TrevorBoydSmith MS cljuga memiliki kemampuan selama bertahun-tahun ... Terkadang gccagak lambat dalam beradaptasi.
Alexis Wilke

29

Saya menemukan triknya. Untuk penyertaan pustaka, alih-alih -Idirdigunakan -isystem dirdi makefile. GCC kemudian memperlakukan boost dll karena sistem menyertakan dan mengabaikan peringatan apa pun darinya.


Perhatikan bahwa jika Anda menggunakan header yang telah dikompilasi, Anda perlu menambahkan bendera saat Anda mengompilasi header dan kode.
pengguna202729

9

#pragmaadalah instruksi untuk kompilator. Anda dapat mengatur sesuatu sebelum #include dan menonaktifkannya setelahnya.

Anda juga dapat melakukannya di baris perintah .

Halaman GCC lain secara khusus tentang menonaktifkan peringatan .

Saya akan memilih opsi untuk menggunakan # pragma dalam kode sumber, dan kemudian memberikan alasan yang masuk akal (sebagai komentar) mengapa Anda menonaktifkan peringatan. Ini berarti alasan tentang file header.

GCC melakukan pendekatan ini dengan mengklasifikasikan jenis peringatan. Anda dapat mengklasifikasikannya menjadi peringatan atau untuk diabaikan. Artikel yang ditautkan sebelumnya akan menunjukkan kepada Anda peringatan mana yang mungkin dinonaktifkan.

Catatan: Anda juga dapat memijat kode sumber untuk mencegah peringatan tertentu dengan menggunakan atribut ; namun, ini mengikat Anda cukup dekat dengan GCC.

Note2: GCC juga menggunakan antarmuka pop / push seperti yang digunakan di kompiler microsoft - Microsoft menonaktifkan peringatan melalui antarmuka ini. Saya sarankan Anda menyelidiki ini lebih lanjut, karena saya bahkan tidak tahu apakah itu mungkin.


Saya menganggap pragma tetapi jika saya menekan peringatan sebelum menyertakan tajuk, bagaimana cara mengembalikannya ke keadaan sebelumnya setelah #include? Saya ingin melihat semua peringatan untuk kode proyek (membantu saya beberapa kali) tetapi memiliki kendali dari baris perintah.
AdSR

4

Anda dapat mencoba menggunakan header yang telah dikompilasi sebelumnya . Peringatan tidak akan hilang tetapi setidaknya tidak akan muncul di kompilasi utama Anda.


1
Ini mungkin ide yang bagus. Pihak ketiga termasuk jangan berubah setiap hari.
AdSR

Persis. Meskipun saya belum sering menggunakannya di Linux, mereka bekerja dengan cukup baik di Visual Studio.
Pablo Santa Cruz

Tidak, mereka masih akan muncul dalam kompilasi kecuali Anda menggunakan cara lain untuk menyembunyikannya (seperti -isystem, tapi ingat untuk menggunakannya baik dalam kompilasi tajuk dan dalam kode)
user202729


1

Menempatkan berikut ini

#pragma GCC system_header

akan mematikan peringatan GCC untuk semua kode berikut di file ini.


-9

Harus ada alasan untuk peringatan tersebut. Ini bisa disebabkan oleh kesalahan dalam kode Anda yang menggunakan perpustakaan, atau oleh kesalahan dalam kode perpustakaan itu sendiri. Dalam kasus pertama, perbaiki kode Anda. Dalam kasus kedua, berhenti menggunakan pustaka atau jika itu adalah kode FOSS, perbaiki.


+1 untuk nasihat yang baik: D tetapi dia bertanya bagaimana melakukan sesuatu yang spesifik: D
Hassan Syed

4
Beberapa peringatan tidak mungkin atau sangat sulit diperbaiki, terutama dalam kode pihak ketiga, terutama dalam kode kaya metaprogramming seperti Boost.
ulidtko

3
Lebih buruk lagi yang mengganggu saya adalah "deklarasi bayangan 'c' anggota dari 'ini' [-Werror = shadow]" dalam, jauh di dalam beberapa header pendorong. Itu tentu saja bukan masalah, tetapi itu dan masalah serupa memuntahkan keluaran dan menyulitkan saya untuk menemukan contoh bayangan nyata dalam basis kode kami.
dmckee --- mantan moderator kucing
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.