Jestem zdezorientowany co do znaczenia void *function()
.
Czy to wskaźnik do funkcji, czy funkcja powraca void*
? Zawsze używałem go w strukturach danych jako funkcji rekurencyjnej zwracającej wskaźnik, ale kiedy zobaczyłem kod w wielowątkowości ( pthread
), jest taka sama deklaracja funkcji. Teraz jestem zdezorientowany, jaka jest między nimi różnica.
c++
c
pointers
function-pointers
declaration
użytkownik9515151
źródło
źródło
void*function();
jest poprawny pod względem składniowym. Na przykład dla Pythona wybrali inną decyzję - format jest częścią składni. IMHO, oba sposoby mają swoje zalety i wady.void *function()
jest funkcją pobierającą dowolną liczbę argumentów i zwracającą wartość, która po dereferencji jest typu void . W C ++void* function()
jest funkcją, która nie przyjmuje argumentów i zwraca wartość wskaźnika do void . Powinieneś zdecydować, w którym języku pytasz.void *
wyłuskać a . W końcu, nawet gdybyś mógł, co byś zrobił zvoid
?Odpowiedzi:
Funkcja ma typ zwracany
void *
.Dlatego zawsze wolę w takich przypadkach oddzielić symbol
*
od nazwy funkcji, takiej jakI jak
Jarod42
wskazano w komentarzu, możesz przepisać deklarację funkcji w C ++, używając końcowego typu powrotu, takiego jakJeśli chcesz zadeklarować wskaźnik do działania, powinieneś napisać
Lub
Lub wskaźnik do funkcji, który zwraca wskaźnik do funkcji
źródło
void* function();
. To nie jest takie kuszące ... ;-) (Edycja nastąpiła właśnie podczas pisania tego.)void * reader();
następniepthread_create(&thread1,null,reader,reader_arg)
zamiastpthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++). :)typedef
jest ... ;-)Ilekroć nie mam pewności co do problemów ze składnią języka C, lubię używać narzędzia cdecl ( wersja online ) do interpretowania mnie. To tłumaczy między składnią C i angielskim.
Na przykład podaję twój przykład
void *foo()
i on zwróciłAby zobaczyć, jak wyglądałaby druga składnia, wpisałem
declare foo as pointer to function returning void
i wróciłemJest to szczególnie przydatne, gdy w jednym wyrażeniu jest wiele poziomów rzutów czcionek, gwiazd lub nawiasów.
źródło
Jest to funkcja zwracająca wskaźnik do
void
.Pomyśl o swojej deklaracji w ten sposób:
Byłaby to funkcja zwracająca
void
(lub nic):Pomyśl o powyższej deklaracji w ten sposób:
Znacznie łatwiejszym sposobem napisania jest użycie
typedef
s:To ogólnie eliminuje zamieszanie wokół wskaźników funkcji i jest znacznie łatwiejsze do odczytania.
źródło
Deklaracje w C / C ++ są odczytywane z identyfikatora na zewnątrz zgodnie z pierwszeństwem operatora .
Szybkie spojrzenie na tabelę pierwszeństwa operatora C / C ++ na wikipedii pokazuje, że operator wywołania funkcji
()
ma wyższy priorytet niż operator pośredni*
. Tak więc deklaracje funkcji brzmią następująco:Zacznij od identyfikatora:
function
isfunction()
funkcja, która nie przyjmuje argumentówvoid* function()
i zwraca avoid*
.Ta ogólna zasada obowiązuje również w przypadku deklaracji tablicowych (
[]
ma również wyższy priorytet niż*
) i kombinacji tych dwóch. Więcjest czytany jako
arr
jestarr[42]
tablica 42 elementów, które są*arr[42]
wskaźniki do(*arr[42])()
funkcje, które nie przyjmują argumentów iint *(*arr[42])()
zwracaćint*
.Przyzwyczajenie się do tego zajmuje trochę czasu, ale po zrozumieniu zasady łatwo jest jednoznacznie odczytać te deklaracje.
źródło