W jednym z moich plików źródłowych projektu znalazłem definicję funkcji C:
int (foo) (int *bar)
{
return foo (bar);
}
Uwaga: obok nie ma gwiazdki foo
, więc nie jest wskaźnikiem funkcji. Albo to jest? Co się tutaj dzieje z połączeniem rekurencyjnym?
c
function
parentheses
użytkownik1859094
źródło
źródło
a(b);
? Deklaracjab
jako zmiennej typua
? Lub wezwanie do działaniaa
z argumentemb
? Różnica jest składniowa i nie możesz wiedzieć, w jaki sposób ją parsować, nie sprawdzając informacji o deklaracjia
; tzn. są to nawiasy wywołujące funkcję Postfiks lub opcjonalne nawiasy wokół deklaratora.Odpowiedzi:
Wobec braku jakichkolwiek działań preprocesora
foo
podpis jest równoważnyJedynym kontekstem, w którym widziałem ludzi umieszczających pozornie niepotrzebne nawiasy wokół nazw funkcji, jest to, że istnieje zarówno funkcja, jak i makro podobne do funkcji o tej samej nazwie, a programista chce zapobiec ekspansji makr.
Ta praktyka może początkowo wydawać się trochę dziwna, ale biblioteka C stanowi precedens, udostępniając niektóre makra i funkcje o identycznych nazwach .
Jedną z takich par funkcji / makr jest
isdigit()
. Biblioteka może to zdefiniować w następujący sposób:Twoja funkcja wygląda prawie identycznie jak powyżej, więc podejrzewam, że tak dzieje się również w twoim kodzie.
źródło
foo(bar)
Wewnątrz funkcji jest za pomocą odpowiedniego makro.foo (int* bar)
zostałby zastąpiony, ale nie(foo) (int *bar)
(następny token pofoo
jest)
)(isdigit)(5)
:?Nawiasy nie zmieniają deklaracji - nadal definiuje zwykłą funkcję o nazwie
foo
.Powodem ich użycia jest prawie na pewno dlatego, że istnieje makro funkcyjne o nazwie
foo
zdefiniowane:Użycie
(foo)
w deklaracji funkcji zapobiega rozwinięciu tego makra w tym miejscu. Prawdopodobnie dzieje się tak, że funkcjafoo()
jest definiowana, a jej ciało jest rozszerzane z makra podobnego do funkcjifoo
.źródło
Nawiasy są bez znaczenia.
Wyświetlany kod jest niczym innym jak nieskończoną rekurencją.
Podczas definiowania wskaźnika funkcji czasami widać dziwne nawiasy, które coś znaczą. Ale tutaj tak nie jest.
źródło