Di beberapa proyek C, saya telah melihat kode ini:
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
(void)osize;
/* some code not using `ud` or `osize` */
return ptr;
}
Apakah dua pemeran yang akan batal memiliki tujuan apa pun?
(void)
efek yang agak berbeda. Pertanyaan ini tentang CJawaban:
Itu ada untuk menghindari peringatan dari compiler karena beberapa parameter tidak digunakan.
sumber
Alasan memiliki parameter yang tidak digunakan dalam prototipe biasanya karena fungsi tersebut perlu menyesuaikan dengan beberapa API eksternal - mungkin itu adalah fungsi perpustakaan, atau penunjuk ke fungsi itu diteruskan ke fungsi lain yang mengharapkan konvensi pemanggilan ini. Namun tidak semua argumen yang digunakan oleh konvensi pemanggilan sebenarnya dibutuhkan dalam fungsi itu sendiri.
Alasan penyebutan nama parameter di body adalah untuk menghindari peringatan seperti
Peringatan ini dapat ditekan dengan menggunakan parameter aktual di badan fungsi. Misalnya jika Anda memiliki pernyataan berikut:
Peringatan ini sekarang disembunyikan. Namun sekarang GCC akan mengeluarkan peringatan lain :
Peringatan ini memberi tahu bahwa pernyataan
ud;
, meskipun C secara sintaksis valid, tidak memengaruhi apa pun sama sekali, dan mungkin merupakan kesalahan, tidak seperti pernyataan tersebut.yang mungkin seharusnya ditulis sebagai
abort();
gantinya untuk melakukan sesuatu.Dan di situlah peran
(void)
pemeran - ini akan memberi tahu kompiler dengan jelas dan eksplisit bahwa pernyataan itu seharusnya sama sekali tidak berpengaruh sama sekali.sumber