Saya bingung tentang arti void *function()
.
Apakah pointer berfungsi atau fungsi kembali void*
? Saya selalu menggunakannya pada struktur data sebagai fungsi rekursif mengembalikan pointer, tetapi ketika saya melihat kode di multithreading ( pthread
) ada deklarasi fungsi yang sama. Sekarang saya bingung apa bedanya mereka.
c++
c
pointers
function-pointers
declaration
pengguna9515151
sumber
sumber
void*function();
secara sintaksis benar. Misalnya untuk Python mereka memilih format keputusan yang berbeda adalah bagian dari sintaksis. IMHO, kedua cara memiliki pro dan kontra.void *function()
adalah fungsi yang mengambil sejumlah argumen arbitrer dan mengembalikan nilai yang, ketika didereferensi, bertipe batal . Dalam C ++,void* function()
adalah fungsi yang tidak mengambil argumen dan mengembalikan nilai pointer-to-void . Anda harus menentukan pilihan bahasa yang Anda tanyakan.void *
. Lagi pula, bahkan jika Anda bisa, apa yang akan Anda lakukan denganvoid
?Jawaban:
Fungsi memiliki tipe kembali
void *
.Jadi saya selalu lebih suka dalam kasus seperti itu untuk memisahkan simbol
*
dari nama fungsi sepertiDan seperti yang
Jarod42
ditunjukkan dalam komentar Anda dapat menulis ulang deklarasi fungsi dalam C ++ menggunakan tipe trailing return sepertiJika Anda ingin mendeklarasikan pointer berfungsi, Anda harus menulis
Atau
Atau penunjuk ke fungsi yang mengembalikan penunjuk ke fungsi
sumber
void* function();
. Itu tidak menggoda ... ;-) (Pengeditan terjadi tepat saat menulis ini.)void * reader();
kemudianpthread_create(&thread1,null,reader,reader_arg)
bukanpthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++). :)typedef
untuk ... ;-)Setiap kali saya tidak yakin tentang masalah sintaksis C, saya suka menggunakan utilitas cdecl ( versi online ) untuk menerjemahkan bagi saya. Ini menerjemahkan antara sintaks C dan Bahasa Inggris.
Misalnya, saya masukan contoh Anda
void *foo()
dan dikembalikanUntuk melihat seperti apa sintaks yang lain, saya masukan
declare foo as pointer to function returning void
dan mengembalikannyaIni menjadi sangat berguna ketika Anda memiliki beberapa tingkat typecast, bintang, atau tanda kurung dalam satu ekspresi.
sumber
Ini adalah fungsi yang mengembalikan pointer ke
void
.Pikirkan deklarasi Anda seperti ini:
Ini akan menjadi fungsi yang mengembalikan
void
(atau tidak sama sekali):Pikirkan pernyataan di atas dengan cara ini:
Cara yang lebih mudah untuk menulis ini adalah dengan menggunakan
typedef
s:Ini umumnya menghilangkan kebingungan di sekitar fungsi pointer dan lebih mudah dibaca.
sumber
Deklarasi dalam C / C ++ dibaca dari pengidentifikasi ke luar mengikuti prioritas operator .
Pandangan cepat pada tabel prioritas operator C / C ++ di wikipedia mengungkapkan bahwa operator panggilan fungsi
()
memiliki prioritas lebih tinggi daripada operator tidak langsung*
. Jadi, deklarasi fungsi Anda berbunyi seperti ini:Mulai di pengidentifikasi:
function
adalahfunction()
sebuah fungsi yang tidak membutuhkan argumenvoid* function()
dan mengembalikan avoid*
.Prinsip umum ini juga berlaku dengan deklarasi array (
[]
juga memiliki prioritas lebih tinggi dari*
) dan kombinasi keduanya. Begitudibaca sebagai
arr
adalaharr[42]
sebuah array dari 42 elemen yang*arr[42]
pointer ke(*arr[42])()
fungsi yang tidak mengambil argumen danint *(*arr[42])()
mengembalikan sebuahint*
.Dibutuhkan sedikit untuk membiasakan diri dengan ini, tetapi begitu Anda sudah memahami prinsipnya, mudah untuk membaca deklarasi-deklarasi itu dengan jelas.
sumber