Misalnya:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
Di C ++ saya bisa memberikan /*...*/
komentar di sekitar parameter. Tetapi tidak dalam C tentu saja, di mana itu memberi saya kesalahan error: parameter name omitted
.
c
gcc
gcc-warning
nixgadget
sumber
sumber
-Wno-unused-parameter
, itu terlalu berisik dan jarang menangkap bug esp. kapan-Wshadow
digunakanJawaban:
Saya biasanya menulis makro seperti ini:
Anda dapat menggunakan makro ini untuk semua parameter yang tidak digunakan. (Perhatikan bahwa ini bekerja pada kompiler apa pun.)
Sebagai contoh:
sumber
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
yang memungkinkan saya untuk menerapkan ini ke beberapa variabel.Di gcc, Anda dapat memberi label parameter dengan
unused
atribut .Dalam praktiknya ini dilakukan dengan meletakkan
__attribute__ ((unused))
tepat sebelum parameter. Sebagai contoh:menjadi
sumber
__attribute__ ((unused))
di depan argumen.__attribute__((unused))
adalah ekstensi GCC eksklusif . Ini didukung oleh beberapa kompiler lain, tetapi saya berasumsi ini tidak akan bekerja dengan MSVC. Ini bukan langsung bagian dari standar kompiler, jadi ini tidak portabel seperti beberapa opsi lainAnda dapat menggunakan atribut gcc / clang yang tidak digunakan, namun saya menggunakan makro ini di header untuk menghindari memiliki atribut spesifik gcc di seluruh sumber, juga memiliki di
__attribute__
mana - mana sedikit verbose / jelek.Maka kamu bisa melakukan ...
Saya lebih suka ini karena Anda mendapatkan kesalahan jika Anda mencoba menggunakan
bar
kode di mana saja sehingga Anda tidak dapat meninggalkan atribut secara tidak sengaja.dan untuk fungsi ...
Catatan 1):
Sejauh yang saya tahu, MSVC tidak memiliki yang setara dengan
__attribute__((__unused__))
.Catatan 2):
The
UNUSED
makro tidak akan bekerja untuk argumen yang mengandung kurung,jadi jika Anda memiliki argumen seperti
float (*coords)[3]
Anda tidak dapat melakukan,float UNUSED((*coords)[3])
ataufloat (*UNUSED(coords))[3]
, ini adalah satu-satunya downside keUNUSED
makro saya menemukan sejauh ini, dalam kasus ini saya jatuh kembali untuk(void)coords;
sumber
#define __attribute__(x)
untuk lingkungan non-GCC (AFAIK tidak ada__attribute__
yang didukung oleh MSVC)?warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)Dengan gcc dengan atribut yang tidak digunakan:
sumber
Melihat ini ditandai sebagai gcc, Anda dapat menggunakan sakelar baris perintah
Wno-unused-parameter
.Sebagai contoh:
Tentu saja ini mempengaruhi keseluruhan file (dan mungkin memproyeksikan tergantung di mana Anda mengatur sakelar) tetapi Anda tidak perlu mengubah kode apa pun.
sumber
Cara khusus gcc / g ++ untuk menekan peringatan parameter yang tidak digunakan untuk blok kode sumber adalah melampirkannya dengan pernyataan pragma berikut:
sumber
Memberi label pada atribut adalah cara yang ideal. MACRO terkadang menyebabkan kebingungan. dan dengan menggunakan void (x), kami menambahkan overhead dalam pemrosesan.
Jika tidak menggunakan argumen input, gunakan
Jika tidak menggunakan variabel yang ditentukan di dalam fungsi
Sekarang nanti gunakan variabel hash untuk logika Anda tetapi tidak perlu bkt. mendefinisikan bkt sebagai tidak digunakan, jika tidak kompiler mengatakan 'set bt tidak digunakan ".
CATATAN: Ini hanya untuk menekan peringatan bukan untuk optimisasi.
sumber
void(x)
, kompiler akan mengoptimalkannya.Saya mendapat masalah yang sama. Saya menggunakan perpustakaan bagian ketiga. Ketika saya mengkompilasi perpustakaan ini, kompiler (gcc / dentang) akan mengeluh tentang variabel yang tidak digunakan.
Seperti ini
Jadi solusinya cukup jelas. Menambahkan
-Wno-unused
sebagai gcc / dentang CFLAG akan menekan semua peringatan "tidak digunakan", bahkan jika Anda telah-Wall
menetapkannya.Dengan cara ini, Anda TIDAK PERLU mengubah kode apa pun.
sumber
Dalam MSVC untuk menekan peringatan tertentu sudah cukup untuk menentukan nomor itu untuk dikompilasi sebagai / wd #. CMakeLists.txt saya berisi blok seperti itu:
Sekarang saya tidak bisa mengatakan apa sebenarnya / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127 artinya, karena saya tidak memperhatikan MSVC selama tiga tahun, tetapi mereka menekan peringatan superpedantic yang tidak mempengaruhi hasil.
sumber
Saya telah melihat gaya ini digunakan:
sumber
struct { int a; } b = {1}; if (b);
GCC memperingatkanused struct type value where scalar is required
,.Sebagai catatan, saya suka jawaban Ayub di atas tapi saya ingin tahu tentang solusi hanya menggunakan nama variabel dengan sendirinya dalam pernyataan "tidak melakukan apa-apa":
Tentu, ini memiliki kekurangan; misalnya, tanpa catatan "tidak digunakan" itu terlihat seperti kesalahan daripada garis kode yang disengaja.
Keuntungannya adalah bahwa tidak ada DEFINE yang diperlukan dan itu menghilangkan peringatan.
Apakah ada perbedaan kinerja, optimasi, atau lainnya?
sumber