Bagaimana Anda menonaktifkan peringatan variabel tidak terpakai yang keluar dari gcc dalam kode pihak ketiga yang tidak ingin saya edit?

94

Saya ingin tahu sakelar apa yang Anda berikan ke kompiler gcc untuk mematikan peringatan variabel yang tidak digunakan? Saya mendapatkan kesalahan dari dorongan pada windows dan saya tidak ingin menyentuh kode dorongan:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

Saya mencoba menggunakan keduanya -Wunused-valuedan -Wno-unused-valuetidak ada yang menyembunyikan pesan di atas.

Apa perintah yang benar, inilah baris kompilasi saya:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Mungkin -Wallmengesampingkan tujuan saya?

WilliamKF
sumber
Seperti pesan kesalahan kurang lebih mengatakan, coba-Werror=no-unused-variable
Joachim Isaksson

Jawaban:

242

The -Wno-unused-variablesaklar biasanya melakukan trik. Namun, itu adalah peringatan yang sangat berguna jika Anda peduli tentang hal-hal ini dalam proyek Anda. Ini menjadi menjengkelkan ketika GCC mulai memperingatkan Anda tentang hal-hal yang tidak ada dalam kode Anda.

Saya akan merekomendasikan Anda menjaga peringatan, tapi menggunakan -isystembukannya -Iuntuk menyertakan direktori proyek pihak ketiga. Tanda tersebut memberi tahu GCC untuk tidak memperingatkan Anda tentang hal-hal yang tidak dapat Anda kendalikan.

Misalnya, alih-alih -IC:\\boost_1_52_0, katakan -isystem C:\\boost_1_52_0.

Semoga membantu. Semoga berhasil!


sumber
Di mana menambahkan pengaturan ini? Apakah itu di bawah "Pengaturan Proyek / AVR GNU C Compiler / Miscellaneous" tetapi akan diabaikan (jalur benar, masih mendapatkan peringatan) Saat menambahkannya ke pengaturan Direktori (hapus centang pada kotak centang jalur relatif) AtmelStudio akan macet.
hfrmobile
3
kami juga memiliki -Wno-unused-parameterparameter fungsi yang tidak digunakan, -Wno-unused-functionuntuk fungsi yang tidak digunakan
Ngo Thanh Nhan
1
Anda membutuhkan:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer
84

Terkadang Anda hanya perlu menekan beberapa peringatan saja dan Anda ingin menyimpan peringatan lain, agar aman. Di kode Anda, Anda dapat menyembunyikan peringatan untuk variabel dan bahkan parameter formal dengan menggunakan atribut GCC yang tidak digunakan . Katakanlah Anda memiliki cuplikan kode ini:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Mungkin ada situasi, ketika Anda perlu menggunakan fungsi ini sebagai penangan - yang (imho) cukup umum di pustaka C ++ Boost. Kemudian Anda memerlukan versi parameter formal kedua , jadi tanda tangan fungsinya sama dengan template yang dibutuhkan penangan, jika tidak kompilasi akan gagal. Tetapi Anda juga tidak benar-benar membutuhkannya dalam fungsi itu sendiri ...

Solusi cara menandai variabel atau parameter formal untuk dikecualikan dari peringatan adalah ini:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC memiliki banyak parameter lain, Anda dapat memeriksanya di halaman manual . Ini juga berfungsi untuk program C, tidak hanya C ++, dan saya pikir ini dapat digunakan di hampir semua fungsi, bukan hanya penangan. Silakan dan coba! ;)

PS: Akhir-akhir ini saya menggunakan ini untuk menekan peringatan serialisasi Boosts di template seperti ini:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

EDIT: Rupanya, saya tidak menjawab pertanyaan Anda seperti yang Anda butuhkan, drak0sha melakukannya dengan lebih baik. Itu karena saya terutama mengikuti judul pertanyaan, kesalahanku. Semoga ini bisa membantu orang lain, yang sampai ke sini karena gelar itu ... :)

Dee'Kej
sumber
7
Untuk parameter formal, Anda dapat menghilangkan namanya, misalnya void func(unsigned number, const int). Kemudian, gcc juga tidak akan mengeluh karena tidak digunakan version.
Olaf Dietsche
@OlafDietsche Saya rasa ini tergantung pada gccversi yang Anda gunakan. IIRC, saya harus menggunakannya 4 tahun yang lalu, untuk menekan peringatan tentang yang tidak digunakan version. ;)
Dee'Kej
67

Jika Anda menggunakan gcc dan ingin menonaktifkan peringatan untuk kode yang dipilih, Anda dapat menggunakan arahan kompilator #pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Untuk kode yang Anda kendalikan, Anda juga dapat menggunakan __attribute__((unused))untuk menginstruksikan compiler bahwa variabel tertentu tidak digunakan.

Ole Wolf
sumber
Secara umum, saya akan mengatakan menggunakan arahan #pragma tidak terlalu aman, kecuali Anda benar-benar tahu apa yang Anda lakukan, atau Anda menggunakan misalnya OpenMP untuk paralelisasi ...;)
Dee'Kej
1
Arahan @ Dee'Kej #pragmabenar-benar aman jika Anda membungkusnya #ifdef some_compiler ... #endif. Peringatan adalah fitur khusus kompiler dan tidak ditentukan oleh standar. Anda tidak dapat menyembunyikan peringatan apa pun dari kode tanpa #pragmas.
Kotauskas
@ vladislav-toncharov Anda benar tentang peringatan yang bersifat khusus kompilator. Tapi kami tidak berbicara tentang peringatan kompiler secara umum di sini - kami berbicara secara khusus tentang GCC. Anda juga benar tentang #pragma tidak berbahaya per kata. Namun, banyak orang IMO tidak tahu bagaimana menggunakan #pragma dengan benar, dan itulah mengapa saya menganggapnya "berbahaya" (karena kurangnya kata-kata yang lebih baik).
Dee'Kej
15

Lihat di man gccbawah Opsi Peringatan. Di sana Anda memiliki sejumlah besarunused

Opsi Peringatan
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

Jika Anda mengawali salah satu dari mereka dengan no-, itu akan menonaktifkan peringatan ini.

Banyak opsi memiliki nama panjang yang dimulai dengan -f atau dengan -W --- misalnya, -fmove-loop-invariants, -Wformat dan seterusnya. Sebagian besar memiliki bentuk positif dan negatif; bentuk negatif dari -ffoo akan menjadi -fno-foo. Buku panduan ini hanya mendokumentasikan salah satu dari dua formulir ini, yang mana saja yang bukan defaultnya.

Penjelasan lebih rinci dapat ditemukan di Options to Request atau Suppress Warnings

Olaf Dietsche
sumber
Tidak tahu bahwa saya dapat mengawali "tidak-" dengan peringatan apa pun.
RNA
10

Penggunaan -Wno-unused-variableharus bekerja.

Mats Petersson
sumber
Ahh, variabel yang tidak digunakan, bukan nilai yang tidak digunakan!
WilliamKF
5
Atau -Wno-error=unused-variablejika Anda ingin menghapus kesalahan dan menyimpan peringatannya.
Oskar N.
1
Anda benar-benar dapat melihat peringatan sebenarnya [-Werror=unused-variable].
Mats Petersson
3

Kompilator sudah memberi tahu Anda, bukan valuetetapi variable. Anda sedang mencari -Wno-unused-variable. Selain itu, coba g++ --help=warningslihat daftar opsi yang tersedia.

Daniel Frey
sumber
3

Bagaimana Anda menonaktifkan peringatan variabel tidak terpakai yang keluar dari gcc?
Saya mendapatkan kesalahan dari dorongan pada windows dan saya tidak ingin menyentuh kode dorongan ...

Anda mengunjungi Boost's Trac dan mengajukan laporan bug terhadap Boost.

Aplikasi Anda tidak bertanggung jawab untuk menghapus peringatan dan kesalahan perpustakaan. Perpustakaan bertanggung jawab untuk membersihkan peringatan dan kesalahannya sendiri.

jww
sumber
0

-Walldan -Wextramenyetel tahapan di GCC dan tahapan berikutnya -Wno-unused-variablemungkin tidak berlaku. Misalnya, jika Anda memiliki:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

lalu GCC melihat instruksi tersebut -Wall -Wextradan sepertinya mengabaikan-Wno-unused-variable

Ini sebaliknya dapat terlihat seperti ini di bawah dan Anda mendapatkan efek yang diinginkan karena tidak dihentikan dalam kompilasi Anda pada variabel yang tidak digunakan:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Ada alasan bagus mengapa ini disebut "peringatan" vs "kesalahan". Gagal mengkompilasi hanya karena kode Anda tidak lengkap (katakanlah Anda menghentikan algoritme) dapat merugikan.

William Cerniuk
sumber
-3
export IGNORE_WARNINGS=1

Itu memang menampilkan peringatan, tetapi berlanjut dengan build

Sifiso Myeni
sumber