Mengapa mentransmisikan nilai parameter fungsi yang tidak digunakan ke batal?

98

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?

bastibe
sumber
Voting to close, sebagai jawaban yang benar (menghalangi peringatan compiler tentang parameter yang tidak digunakan) ada dalam pertanyaan terkait Charles.
TED
@Cody Grey - Itu ditutup karena alasan itu. Namun sebenarnya itu bukan dup dari pertanyaan itu. 689677 berbicara tentang pengembalian casting ke void, bukan parameter.
TED
19
Sebenarnya kedua duplikat tidak valid untuk pertanyaan ini. Salah satunya adalah C ++, yang lainnya adalah tentang nilai kembali. Ini bukanlah hal yang sama . Apakah ada duplikat parameter C?
Matt Joiner
2
Ini adalah pertanyaan yang berbeda dari yang dicakup oleh duplikat yang disarankan. Saya bisa melihat mengapa kesalahan itu dibuat. Dibuka kembali (jelas).
Pos Tim
4
Perhatian: tolong jangan tutup ini sebagai duplikat dari pertanyaan C ++ karena C ++ menggunakan (void)efek yang agak berbeda. Pertanyaan ini tentang C
Antti Haapala

Jawaban:

89

Itu ada untuk menghindari peringatan dari compiler karena beberapa parameter tidak digunakan.

Benoit Thiery
sumber
3
Apa cara terbaik untuk menyembunyikan peringatan: stackoverflow.com/questions/3417837/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@Benoit Apa sebenarnya yang dilakukan casting ke void? Apakah satu-satunya fungsi untuk menunjukkan kepada kompilator bahwa Anda dengan sengaja mengabaikan sesuatu atau apakah (void) benar-benar melakukan sesuatu dan ketika kompilator melihatnya, itu hanya akan menghitungnya sebagai telah melakukan sesuatu dengan variabel dan oleh karena itu tidak mengeluarkan peringatan?
Tan Wang
2
@TanWang Fungsi satu-satunya adalah menunjukkan kepada kompilator bahwa Anda sengaja mengabaikan sesuatu. Itu tidak akan melakukan apa pun saat runtime.
zwol
14

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

unused.c: In function l_alloc’:
unused.c:3:22: warning: unused parameter ud [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

Peringatan ini dapat ditekan dengan menggunakan parameter aktual di badan fungsi. Misalnya jika Anda memiliki pernyataan berikut:

ud;

Peringatan ini sekarang disembunyikan. Namun sekarang GCC akan mengeluarkan peringatan lain :

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

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.

abort;

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.

Antti Haapala
sumber