Przypadkowo przyłapałem się na używaniu dwóch różnych stylów definicji wskaźników funkcji C w różnych miejscach i postanowiłem napisać program minimalny, aby przetestować te różnice.Czy te dwa style definicji wskaźnika funkcji C są różne?
Oba style których mowa, to:
int (comp (int))
i
int (*comp)(int)
pisałem minimalny program, który używa obu tych stylów dla tego samego wskaźnika funkcji, jeden dla deklaracji z funkcja i jedna dla tej samej funkcji, aby zobaczyć, co miałby do powiedzenia kompilator.
Oświadczenie:
int a_or_b (int (*a_fn)(), int (b_fn()), int (*comp)(int));
Definicja:
int a_or_b (int (a_fn()), int (*b_fn)(), int (comp(int)))
{
int out = a_fn();
if (comp (out))
out = b_fn();
return out;
}
Jak można (mam nadzieję) widać, dla pierwszego parametru w deklaracji użyłem stylu int (*a_fn)()
, podczas gdy w definicji funkcji , Użyłem stylu int (a_fn())
. Robię coś podobnego z następnymi dwoma argumentami.
I Przypuszcza się, że może to być niekompatybilne typów, tych stylów może być różnica pomiędzy odniesieniem przejazdu, i przechodzi przez wartość przydziału zmiennej, ale gdy opracowano program kompilator cicho i szczęśliwie zestawiane to. Brak błędów, brak ostrzeżeń, nic.
Jak widziałem wiele tutoriali opowiadających się za drugim stylem, podczas gdy ja osobiście preferuję pierwszy styl dla celów estetycznych, interesuje mnie różnica między tymi dwoma stylami i która jest zalecana.
Pełny przykład kod:
#include <stdio.h>
int a();
int b();
int a_or_b (int (*a_fn)(), int (b_fn()), int (*comp)(int));
int a()
{
return 1;
}
int b()
{
return 2;
}
int comparison (int param)
{
return param;
}
int a_or_b (int (a_fn()), int (*b_fn)(), int (comp(int)))
{
int out = a_fn();
if (comp (out))
out = b_fn();
return out;
}
int main (int argc, char **argv)
{
printf ("%i\n", a_or_b (a, b, comparison));
return 0;
}
Na liście parametrów funkcji "funkcje" przekształcają się w wskaźniki funkcji. ISO/IEC 9899: 2011 §6.7.6.3 Deklaratory funkcji (w tym prototypy) mówią: _¶8 Deklaracja parametru jako "funkcja zwracająca funkcję" "jest dostosowywana do" wskaźnika do funkcji zwracającego typu "" ... _ –