void (*func)(int(*[ ])());
Odpowiedz
To nie jest stwierdzenie, że to oświadczenie.
Deklaruje func
jako wskaźnik do funkcji powrocie nieważne i biorąc jeden argument typu int (*[])()
, która sama jest wskaźnik do wskaźnika do funkcji powrocie int i przy stałej ale nieokreśloną liczbę argumentów.
wyjście cdecl dla małowierni:
cdecl> explain void (*f)(int(*[ ])());
declare f as pointer to function (array of pointer to function returning int) returning void
"ustalona ale nieokreślona liczba argumentów" - pytanie jest również oznaczone C++, w którym to przypadku drugi typ funkcji przyjmuje dokładnie zero argumentów. –
Tag C++ został dodany przez kogoś innego niż oryginalny plakat, po tym jak odpowiedziałem. Posunięcie zbyt sprytne o połowę, według mojej książki. – caf
Cholera, to jest podstępne. Nigdy nie jest jasne, czy ktoś mówi "C/C++", czy powiedzieli to, ponieważ uważają, że odpowiedź jest taka sama dla obu języków, ponieważ uważają, że odpowiedzi są różne między tymi dwoma ... –
void (*func)(blah);
jest wskaźnikiem do funkcji biorąc blah
jako argument, gdzie sama blah
jest int(*[ ])()
jest tablicą wskaźników funkcji.
Oto przewodnik na czytanie deklaracji C:
http://www.ericgiguere.com/articles/reading-c-declarations.html
Ogólna procedura czytania owłosione declarators jest znalezienie skrajnie lewą identyfikator i swój sposób pracy na zewnątrz, pamiętając, że []
i ()
wiążą przed *
(tj , *a[]
to tablica wskaźnika, a nie wskaźnik do tablicy). Sprawa ta jest nieco trudniejsza ze względu na brak identyfikatora na liście parametrów, ale ponownie, []
wiąże się przed *
, więc wiemy, że *[]
wskazuje na tablicę pozytów.
więc, biorąc pod uwagę
void (*func)(int(*[ ])());
łamiemy go w następujący sposób:
func -- func
*func -- is a pointer
(*func)( ) -- to a function taking
(*func)( [ ] ) -- an array
(*func)( *[ ] ) -- of pointers
(*func)( (*[ ])()) -- to functions taking
-- an unspecified number of parameters
(*func)(int(*[ ])()) -- returning int
void (*func)(int(*[ ])()); -- and returning void
Co to będzie wyglądać w praktyce byłoby coś jak poniżej:
/**
* Define the functions that will be part of the function array
*/
int foo() { int i; ...; return i; }
int bar() { int j; ...; return j; }
int baz() { int k; ...; return k; }
/**
* Define a function that takes the array of pointers to functions
*/
void blurga(int (*fa[])())
{
int i;
int x;
for (i = 0; fa[i] != NULL; i++)
{
x = fa[i](); /* or x = (*fa[i])(); */
...
}
}
...
/**
* Declare and initialize an array of pointers to functions returning int
*/
int (*funcArray[])() = {foo, bar, baz, NULL};
/**
* Declare our function pointer
*/
void (*func)(int(*[ ])());
/**
* Assign the function pointer
*/
func = blurga;
/**
* Call the function "blurga" through the function pointer "func"
*/
func(funcArray); /* or (*func)(funcArray); */
+1 wystarczająco dobrze, spróbuj wyjaśnić, jak czytać takie wyrażenia i przykład. –
+1, fajny :) –
+1 dla parsowania bloku na początku. Miły! –
Geordi
jest botem C++, pozwalającym na szkolenie:
<litb> geordi: {} void (*func)(int(*[ ])());
<litb> geordi: -r << ETYPE_DESC(func)
<geordi> lvalue pointer to a function taking a pointer to a pointer to a nullary function
returning an integer and returning nothing
Można zrobić wiele pożytecznych rzeczy, jak pokazano wszystkie parametrami deklaracji (ten, w rzeczywistości jest tylko dopasowania surowe C++
nazwy reguły gramatyki):
<litb> geordi: show parameter-declarations
<geordi> `int(*[ ])()`.
Zróbmy to w odwrotnym kierunku:
<litb> geordi: {} int func;
<litb> geordi: make func a pointer to function returning void and taking array of pointer to
functions returning int
<litb> geordi: show
<geordi> {} void (* func)(int(*[])());
Wykonuje wszystko, co mu się podasz, jeśli o to poprosisz. Jeśli są szkoleni, ale po prostu zapomniałem niektóre z przerażających zasad nawiasach, można również mieszać C++ oraz opisy typu Geordi stylu:
<litb> geordi: make func a (function returning void and taking (int(*)()) []) *
<geordi> {} void (* func)(int(*[])());
Miłej zabawy!
- 1. Czy możesz wyjaśnić pojęcie Web RESTful?
- 2. Czy możesz wyjaśnić tę rzecz o enkapsulacji?
- 3. Objective C - Oświadczenie Błąd - proszę wyjaśnić
- 4. Czy możesz wyjaśnić mi dziwne zachowanie C# z opcjonalnymi argumentami?
- 5. Czy możesz wyjaśnić tę dziwaczną awarię w środowisku wykonawczym .NET?
- 6. Czy możesz wyjaśnić zasadę podstawiania Liskov dobrym przykładem C#?
- 7. Czy mógłbyś mi wyjaśnić funciaki OCaml?
- 8. Następujące generowanie wartości postgresql
- 9. Komenda Bash:() {: |: & };: spowoduje procesy od zera do jądra. Czy możesz wyjaśnić składnię?
- 10. Czy możesz wyjaśnić, jak przenieść/wygenerować kod html na inny kod HTML - PHP?
- 11. Czy możesz wyjaśnić to rekursywne rozwiązanie z Chap 3 Eoquent js?
- 12. Czy ktoś może wyjaśnić attr?
- 13. Czy ktoś może wyjaśnić OAuth?
- 14. Czy następujące niezdefiniowane zachowanie? i = func (i)
- 15. Czy możesz przechodzić przez wszystkie przyciski opcji?
- 16. Co oznacza CC? = W pliku Makefile?
- 17. Alternatywa dla „switch” oświadczenie
- 18. SQL - OŚWIADCZENIE CASE - GDY instrukcja i oświadczenie
- 19. Jak rozwiązać następujące nawroty?
- 20. Czy możesz zablokować ogólny słownik?
- 21. czy możesz telnetować do ssh?
- 22. mailto z wieloma adresami cc
- 23. Wyjaśnić System.Diagnostics.CodeAnalysis.SuppressMessage
- 24. to oświadczenie po argumentach contructor
- 25. Oświadczenie kontra Przygotowane oświadczenie w zakresie Prekompilacji
- 26. Czy można użyć wywołania/cc do implementacji rekursji?
- 27. Czy istnieje jakaś różnica między C c; i Cc = C() ;?
- 28. Czy C++ "deklaracja i inicjalizacja" oświadczenie, wyrażenie?
- 29. Mylące użycie przecinka w „czy” oświadczenie
- 30. Czy jest oczekiwane oświadczenie dotyczące wątków?
Zobacz http: // stackoverflow.com/questions/1448849/jak-to-zrozumieć-skomplikowane-funkcje-deklaracje – pmg