Di salah satu file sumber proyek saya, saya menemukan definisi fungsi C ini:
int (foo) (int *bar)
{
return foo (bar);
}
Catatan: tidak ada tanda bintang di sebelahnya foo
, jadi itu bukan penunjuk fungsi. Atau itu? Apa yang terjadi di sini dengan panggilan rekursif?
c
function
parentheses
pengguna1859094
sumber
sumber
a(b);
? Deklarasib
sebagai variabel tipea
? Atau panggilan untuk berfungsia
dengan argumenb
? Perbedaannya adalah sintaksis, dan Anda tidak dapat mengetahui cara untuk menguraikannya tanpa melihat info deklarasia
; yaitu tanda kurung fungsi postfix, atau tanda kurung opsional di sekitar deklarator.Jawaban:
Dengan tidak adanya hal-hal preprosesor yang terjadi,
foo
tanda tangan setara denganSatu-satunya konteks di mana saya telah melihat orang menempatkan tanda kurung yang tampaknya tidak perlu di sekitar nama fungsi adalah ketika ada fungsi dan makro seperti fungsi dengan nama yang sama, dan programmer ingin mencegah ekspansi makro.
Praktek ini mungkin tampak sedikit aneh pada awalnya, tetapi perpustakaan C menetapkan preseden dengan menyediakan beberapa makro dan fungsi dengan nama yang identik .
Satu pasangan fungsi / makro adalah
isdigit()
. Perpustakaan mungkin mendefinisikannya sebagai berikut:Fungsi Anda terlihat hampir sama dengan yang di atas, jadi saya curiga ini juga terjadi pada kode Anda.
sumber
foo(bar)
dalam fungsi menggunakan makro yang sesuai.foo (int* bar)
akan diganti, tetapi tidak(foo) (int *bar)
(token berikutnya) setelahfoo
adalah)
)(isdigit)(5)
:?Paranthes tidak mengubah deklarasi - itu hanya mendefinisikan fungsi biasa yang disebut
foo
.Alasan bahwa mereka telah digunakan hampir pasti karena ada fungsi-seperti makro yang disebut
foo
defined:Menggunakan
(foo)
dalam deklarasi fungsi mencegah makro ini diperluas di sini. Jadi apa yang mungkin terjadi adalah bahwa suatu fungsifoo()
sedang didefinisikan dengan tubuhnya sedang diperluas dari makro seperti fungsifoo
.sumber
Tanda kurung tidak ada artinya.
Kode yang Anda perlihatkan hanyalah rekursi tak terbatas.
Saat mendefinisikan pointer fungsi, Anda terkadang melihat tanda kurung aneh yang berarti sesuatu. Tapi ini bukan masalahnya.
sumber