Apakah ada cara untuk menonaktifkan hanya satu baris peringatan di file cpp dengan visual studio?
Misalnya, jika saya menangkap pengecualian dan tidak menanganinya, saya mendapatkan kesalahan 4101 (variabel lokal tidak direferensikan). Apakah ada cara untuk mengabaikan ini hanya di fungsi itu, tetapi melaporkannya ke unit kompilasi? Saat ini, saya meletakkannya #pragma warning (disable : 4101)
di bagian atas file, tetapi itu jelas hanya mematikannya untuk seluruh unit.
c++
visual-c++
warnings
pragma
Kue kering
sumber
sumber
catch (const std::exception& /* unnamed */) {.... }
. Itu tidak menjawab pertanyaan Anda, tetapi mungkin menyelesaikan masalah Anda.Jawaban:
sumber
clang
tampaknya tidak mendukung pragma ini, tetapi Anda dapat mencapai efek yang sama dengan#pragma clang diagnostic push
,#pragma clang diagnostic ignored "-Wunused-variable"
, dan#pragma clang diagnostic pop
. Lihat "Mengontrol Diagnositika Melalui Pragmas" di Panduan Pengguna Clang/wd4101
. Perhatikan bahwa tidak ada angka normal:
antara bendera dan angka, dan Anda tidak dapat membuat daftar angka yang dipisahkan koma. Untuk kompiler lain mungkin menjadi/nowarn:4101
gantinya.Jika Anda hanya ingin menyembunyikan peringatan dalam satu baris kode, Anda dapat menggunakan
suppress
penentu peringatan :Untuk satu baris kode, cara kerjanya sama seperti penulisan berikut:
sumber
suppress
beroperasi pada satu baris kode yang telah diproses sebelumnya. Jika baris berikut#pragma warning(suppress: ...)
adalah#include
arahan (yang memperluas file yang direferensikan oleh parameternya ke dalam unit kompilasi saat ini), efeknya berlaku untuk baris pertama file itu saja. Ini harusnya jelas, karena peringatan dibuat oleh kompilator. Kompilator beroperasi pada kode yang telah diproses sebelumnya.#pragma
push / pop sering menjadi solusi untuk masalah semacam ini, tetapi dalam kasus ini mengapa Anda tidak menghapus variabel yang tidak direferensikan saja?sumber
:P
).Gunakan
#pragma warning ( push )
, lalu#pragma warning ( disable )
, masukkan kode Anda, lalu gunakan#pragma warning ( pop )
seperti yang dijelaskan di sini :sumber
Contoh:
Pragma ini berlaku untuk C ++ yang dimulai dengan Visual Studio 2005.
https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
Pragma TIDAK valid untuk C # melalui Visual Studio 2005 melalui Visual Studio 2015.
Kesalahan: "Diharapkan menonaktifkan atau memulihkan".
(Saya kira mereka tidak pernah sempat menerapkan
suppress
...)https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx
C # membutuhkan format yang berbeda. Ini akan terlihat seperti ini (tetapi tidak berfungsi):
Dari pada
suppress
, Anda harusdisable
danenable
:Itu SANGAT jelek, saya pikir lebih pintar untuk hanya menatanya kembali:
sumber
Alih-alih meletakkannya di atas file (atau bahkan file header), cukup bungkus kode yang dimaksud dengan
#pragma warning (push)
,#pragma warning (disable)
dan pencocokan#pragma warning (pop)
, seperti yang ditunjukkan di sini .Meski ada beberapa opsi lain, termasuk
#pramga warning (once)
.sumber
Satu juga dapat menggunakan
UNREFERENCED_PARAMETER
didefinisikan dalamWinNT.H
. Definisinya hanya:Dan gunakan seperti:
Mengapa Anda menggunakannya, Anda mungkin berpendapat bahwa Anda bisa menghilangkan nama variabel itu sendiri. Ada beberapa kasus (konfigurasi project berbeda, build Debug / Rilis) di mana variabel mungkin benar-benar digunakan. Dalam konfigurasi lain variabel itu tidak digunakan (dan karenanya peringatan).
Beberapa analisis kode statis mungkin masih memberikan peringatan untuk pernyataan tidak masuk akal ini (
wParam;
). Dalam hal ini, Anda dapat menggunakanDBG_UNREFERENCED_PARAMETER
yang sama sepertiUNREFERENCED_PARAMETER
pada build debug, dan melakukannyaP=P
dalam build rilis.sumber
[[maybe_unused]]
atributJika Anda ingin menonaktifkan
unreferenced local variable
tulis di beberapa headerdan gunakan
sumber
(void)unusedVar;
?(void)unusedVar;?
bukan C ++ standar konforman.static_cast<void>(unusedVar)
.Any expression can be explicitly converted to type “cv void.” The expression value is discarded
menurutnya Anda dapat menulisstatic_cast<void>(unusedVar)
danstatic_cast<const void>(unusedVar)
danstatic_cast<volatile void>(unusedVar)
. Semua formulir valid. Saya harap ini menjelaskan keraguan Anda.Dalam situasi tertentu Anda harus memiliki parameter bernama tetapi Anda tidak menggunakannya secara langsung.
Sebagai contoh, saya menemukannya di VS2010, ketika 'e' hanya digunakan di dalam sebuah
decltype
pernyataan, kompilator mengeluh tetapi Anda harus memiliki variabel bernamae
.Semua non-
#pragma
saran di atas semuanya diringkas menjadi hanya menambahkan satu pernyataan:sumber
seperti yang disebutkan @rampion, jika Anda berada di clang gcc, peringatannya adalah berdasarkan nama, bukan angka, dan Anda harus melakukan:
info ini berasal dari sini
sumber