2013-07-28 8 views
5

Kod używam jest to stwierdzenie:Czy gwiazdka jest opcjonalna w wskaźniku funkcji?

typedef void (udp_data_notify)(OS_FIFO * pfifo, WORD port); 

To wygląda deklaracji wskaźnika do funkcji udp_data_notify, jednak nie ma *. Czy nadal może być wskaźnikiem funkcji bez gwiazdki?

Oto oświadczenie, że korzysta udp_data_notify:

void RegisterUDPFifoWithNotify(WORD dp, OS_FIFO *pnewfifo , udp_data_notify * nudp) 

Każda pomoc, co dzieje się będą mile widziane!

+0

dereferencji wskaźnik funkcji technicznie mógłby produkować pierwszy bajt pierwszej instrukcji kodu maszynowego funkcji. Najważniejsze jest to, co chcesz z tym zrobić w przenośny sposób. –

+0

możliwy duplikat [Co oznacza typedef z nawiasami jak "typedef int (f) (void)"? Czy to prototyp funkcji?] (http://stackoverflow.com/questions/3674200/what-does-a-typedef-with-parenthesis-like-typedef-int-fvoid-mean-is-it-a) –

Odpowiedz

0

Wyświetlany typedef deklaruje, że udp_data_notify jest aliasem dla typu funkcji. Następnie deklaracja parametru udp_data_notify *nudp deklaruje, że jest ona wskaźnikiem funkcji tego typu. Nie ma tutaj żadnej funkcji.

Jeśli chodzi o operator wywołania funkcji (przyrostek ()), wyrażenie określające wywoływaną funkcję musi być wskaźnikiem dla funkcji. Gdy wywołujesz funkcję normalnie, bez wskaźnika, na przykład sqrt(2), funkcja jest automatycznie konwertowana na wskaźnik dla ciebie. Tak więc sqrt(2) jest w rzeczywistości (&sqrt)(2). Gdy wywołujesz funkcję ze wskaźnikiem, wywołanie jest już we właściwej formie.

+0

Funkcja przekształcana na wskaźnik wydaje mi się, że istnieje nowe zachowanie C99. W C89 i K & R, z niejawnymi funkcjami, nienasycona forma 'f()' dla wywołań funkcji wydaje się być w rzeczywistości przypadkiem specjalnym. Zauważ, że '(f)()' jest nieprawidłowe, jeśli 'f' nie jest zadeklarowane, nawet w C89. –

4

typedef takich jak:

typedef void name(int); 

(nawias około name są redundantne) definiuje name jako typ funkcji, a nie wskaźnik funkcji. To będzie:

typedef void (*pname)(int); 

Prawdopodobnie zastanawiasz się, do czego są one dobre. Dobrze, typy funkcyjne nie są bardzo przydatne, inne niż dla deklarujących wskaźników:

name *pointer_to_function; 

i które mogą być wykonane prawdopodobnie bardziej czytelne z drugiej typedef:

pname pointer_to_function; 

to dlatego, że nie można zdefiniować zmienną funkcja typu. Jeśli spróbujesz, będziesz po prostu napisać prototyp funkcji, ale w dość zaszyfrowanej składnię:

name foo; //declaration (prototype), not variable 
void foo(int x) //definition 
{ 
} 

Należy jednak pamiętać, że nie można używać typedef zdefiniować funkcję:

name foo {} //syntax error! 
+0

"typy funkcji nie są zbyt użyteczne? Czy są jakieś przypadki, w których jest to użyteczne? – onmyway133

+1

@ onmyway133: Nie wiem, o ile nie uznasz zaciemniania za użyteczne – rodrigo

+0

Słyszałem, że wiele osób twierdzi, że" deklaracja braku gwiazdki "jest automatycznie konwertowane na "deklarację gwiazdkową", – onmyway133

3

Jak już powiedział, typedef deklaruje alias dla typu funkcji. Jeśli chcesz go użyć do zadeklarowania wskaźnika funkcji, wymagana jest gwiazdka (udp_data_notify* x). Deklaracja bez gwiazdki (udp_data_notify x) byłaby deklaracją funkcji, z wyjątkiem jednego szczególnego przypadku. Gdy używany w parametrze typu funkcja automatycznie się do odpowiedniego typu wskaźnik funkcji:

typedef void F(void); 
void foo(F a, F* b) // special case; a and b are both function pointers 
{ 
    F c; // function declaration 
    F* d; // function pointer 
} 
Powiązane problemy