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?


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 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.