Saya memiliki aplikasi lintas platform dan dalam beberapa fungsi saya tidak semua nilai yang diteruskan ke fungsi digunakan. Karenanya saya mendapat peringatan dari GCC yang memberi tahu saya bahwa ada variabel yang tidak digunakan.
Apa cara pengkodean terbaik di sekitar peringatan?
# Jika ada di sekitar fungsi?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Ini sangat jelek tetapi sepertinya cara kompiler lebih suka.
Atau apakah saya menetapkan nol pada variabel di akhir fungsi? (Yang saya benci karena itu mengubah sesuatu dalam aliran program untuk membungkam peringatan kompiler).
Apakah ada cara yang benar?
c++
gcc
warnings
gcc-warning
Phil Hannent
sumber
sumber
Q_UNUSED
makro hanya untuk ini. Lihat di dokumentasi.Jawaban:
Anda bisa meletakkannya dalam
(void)var;
ekspresi " " (tidak melakukan apa - apa) sehingga kompiler melihatnya digunakan. Ini portabel antar kompiler.Misalnya
Atau,
sumber
Q_UNUSED
diimplementasikan pada prinsipnya.#define UNUSED(expr) (void)(expr)
harus bekerja terlalu (tanpa do-while).template<typename... Args> void f(const Args&... args)
saya tidak bisa menulis(void)args;
atau(void)args...;
karena keduanya kesalahan sintaks.Di GCC dan Dentang Anda dapat menggunakan
__attribute__((unused))
arahan preprosesor untuk mencapai tujuan Anda.Sebagai contoh:
sumber
C ++ 17 sekarang menyediakan
[[maybe_unused]]
atribut.http://en.cppreference.com/w/cpp/language/attributes
Cukup bagus dan standar.
sumber
Solusi Anda saat ini adalah yang terbaik - beri komentar nama parameter jika Anda tidak menggunakannya. Itu berlaku untuk semua kompiler, jadi Anda tidak perlu menggunakan pra-prosesor untuk melakukannya secara khusus untuk GCC.
sumber
g++
peringatan tentang hal itu.) Dalam kasus seperti itu, apa yang akan Anda rekomendasikan?Pembaruan C ++ 17
Dalam C ++ 17 kita mendapatkan atribut [[mungkin_unused]] yang tercakup dalam [dcl.attr.unused]
Untuk contoh berikut:
Baik dentang dan gcc menghasilkan diagnostik menggunakan -Wall -Wextra untuk bilah dan unused_bool ( Lihat langsung ).
Saat menambahkan [[mungkin_tidak digunakan]] membungkam diagnostik:
lihat langsung .
Sebelum C ++ 17
Dalam C ++ 11 bentuk
UNUSED
makro alternatif dapat dibentuk menggunakan ekspresi lambda ( melalui Ben Deane ) dengan menangkap variabel yang tidak digunakan:Doa langsung dari ungkapan lambda harus dioptimalkan, dengan memberikan contoh berikut:
kita dapat melihat di godbolt bahwa panggilan dioptimalkan jauh:
sumber
template <class T> inline void NOTUSED( T const & result ) { static_cast<void>(result); }
Anda juga bisa menggunakan lambda dalam fungsinya, saya kira.[&x]{}()
tidak benar-benar membungkam peringatan, tetapi meneruskan peringatan dari fungsi pemanggil ke lambda sebagai gantinya. Diperlukan waktu hingga kompiler mengidentifikasi ini sebagai peringatan, tetapi clang-rapi sudah mengeluhkan variabel yang tidak digunakan dalam daftar tangkap.Cara yang lebih bersih adalah dengan mengomentari hanya nama variabel:
sumber
#if 0 / #endif
blokir komentar.Seorang rekan kerja hanya menunjuk saya ke makro kecil yang menyenangkan di sini
Untuk memudahkan saya akan menyertakan makro di bawah ini.
sumber
gcctidak menandai peringatan ini secara default. Peringatan ini harus dinyalakan baik secara eksplisit dengan meneruskan
-Wunused-parameter
ke kompiler atau secara implisit dengan melewati-Wall -Wextra
(atau mungkin beberapa kombinasi bendera lainnya).Peringatan parameter yang tidak digunakan dapat dengan mudah ditekan dengan melewati
-Wno-unused-parameter
compiler, tetapi perhatikan bahwa flag penonaktifan ini harus datang setelah setiap kemungkinan flag yang memungkinkan untuk peringatan ini di baris perintah compiler, sehingga dapat berlaku.sumber
cara makro-kurang dan portabel untuk mendeklarasikan satu atau lebih parameter sebagai tidak terpakai:
sumber
Menggunakan arahan preprosesor dianggap jahat sebagian besar waktu. Idealnya Anda ingin menghindari mereka seperti Hama. Ingatlah bahwa membuat kompiler memahami kode Anda itu mudah, membiarkan programmer lain memahami kode Anda jauh lebih sulit. Beberapa lusin kasus seperti ini di sana-sini membuatnya sangat sulit untuk dibaca sendiri nanti atau untuk orang lain sekarang.
Salah satu cara mungkin untuk menempatkan parameter Anda bersama-sama menjadi semacam kelas argumen. Anda kemudian dapat menggunakan hanya sebagian dari variabel (setara dengan Anda menetapkan 0 benar-benar) atau memiliki spesialisasi yang berbeda dari kelas argumen untuk setiap platform. Namun ini mungkin tidak sepadan, Anda perlu menganalisis apakah itu cocok.
Jika Anda dapat membaca templat yang tidak mungkin, Anda mungkin menemukan tips lanjutan di buku "Exceptional C ++". Jika orang-orang yang akan membaca kode Anda dapat memperoleh keahlian mereka untuk mencakup hal-hal gila yang diajarkan dalam buku itu, maka Anda akan memiliki kode yang indah yang juga dapat dengan mudah dibaca. Kompiler juga akan sangat menyadari apa yang Anda lakukan (alih-alih menyembunyikan semuanya dengan preprocessing)
sumber
#define UNUSED(expr) (void)(expr)
pantas.Peringatan pertama dihasilkan oleh definisi variabel dalam file sumber bukan file header. Header dapat tetap asli dan harus, karena Anda mungkin menggunakan sesuatu seperti doxygen untuk menghasilkan dokumentasi API.
Saya akan berasumsi bahwa Anda memiliki implementasi yang sama sekali berbeda dalam file sumber. Dalam kasus ini, Anda dapat mengomentari parameter yang menyinggung atau hanya menulis parameter.
Contoh:
Ini mungkin tampak samar, sehingga mendefinisikan makro seperti TIDAK DIGUNAKAN. Cara MFC melakukannya adalah:
Seperti ini Anda melihat peringatan masih dalam debug membangun, mungkin bisa membantu.
sumber
Apakah tidak aman untuk selalu mengomentari nama parameter? Jika tidak, Anda dapat melakukan sesuatu seperti
Ini sedikit lebih jelek.
sumber
Saya telah melihat ini alih-alih
(void)param2
cara membungkam peringatan:Sepertinya ini ditambahkan di C ++ 11
sumber
Menggunakan
UNREFERENCED_PARAMETER(p)
bisa berhasil. Saya tahu itu didefinisikan dalam WinNT.h untuk sistem Windows dan dapat dengan mudah didefinisikan untuk gcc juga (jika belum memilikinya).UNREFERENCED PARAMETER(p)
didefinisikan sebagaidi WinNT.h.
sumber
Gunakan flag compiler, mis. Flag untuk GCC:
-Wno-unused-variable
sumber
Anda bisa menggunakan
__unused
untuk memberi tahu kompiler bahwa variabel mungkin tidak digunakan.sumber
__unused
bukan standar C ++, dan lebih tepatnya, Anda juga tidak memposting ... Itu Objective-C. Jadi jawaban ini hanya benar-benar berguna untuk kompiler tertentu, dan itu membuat kode non-portable, dan pada kenyataannya tidak benar-benar valid karena kode pengguna tidak dimaksudkan untuk menggunakan pengidentifikasi yang diawali dengan__
, yang disediakan untuk implementasi.Di C ++ 11, ini adalah solusi yang saya gunakan:
Diverifikasi sebagai perangkat portabel (setidaknya pada msvc modern, dentang dan gcc) dan tidak menghasilkan kode tambahan saat optimasi diaktifkan. Tanpa optimasi, pemanggilan fungsi ekstra dilakukan dan referensi ke parameter disalin ke stack, tetapi tidak ada makro yang terlibat.
Jika kode tambahan adalah masalah, Anda dapat menggunakan deklarasi ini sebagai gantinya:
tetapi pada saat itu, makro menyediakan keterbacaan yang lebih baik:
sumber
Ini berfungsi dengan baik tetapi membutuhkan C ++ 11
sumber
ALLCAPS
apa pun kecuali makro, yang membuat mereka terlihat jelek dan tidak diinginkan, tetapi tidak ada hal buruk tentang ini, sungguh, kecuali bahwastatic_cast
akan lebih baik.Saya menemukan sebagian besar jawaban yang disajikan hanya berfungsi untuk variabel lokal yang tidak digunakan, dan akan menyebabkan kesalahan kompilasi untuk variabel global statis yang tidak digunakan.
Makro lain diperlukan untuk menekan peringatan variabel global statis yang tidak digunakan.
Ini berfungsi karena tidak ada peringatan yang akan dilaporkan untuk variabel global non-statis di ruang nama anonim.
Diperlukan C ++ 11
sumber
Lol! Saya tidak berpikir ada pertanyaan lain pada SO yang mengungkapkan semua bidat yang dirusak oleh Chaos lebih baik dari yang ini!
Dengan segala hormat terhadap C ++ 17 ada pedoman yang jelas dalam Pedoman Inti C ++ . AFAIR, kembali pada tahun 2009 opsi ini tersedia serta hari ini. Dan jika seseorang mengatakan itu dianggap sebagai bug di Doxygen maka ada bug di Doxygen
sumber
Saya tidak melihat masalah Anda dengan peringatan itu. Dokumentasikan dalam header metode / fungsi yang dikompilasi xy akan mengeluarkan peringatan (benar) di sini, tetapi variabel tesis ini diperlukan untuk platform z.
Peringatan sudah benar, tidak perlu mematikannya. Itu tidak membatalkan program - tetapi harus didokumentasikan, bahwa ada alasannya.
sumber