właśnie przeżywa pewnego kodu w Internecie i znalazłem to:Complex deklaracja C
float * (*(*foo())[SIZE][SIZE])()
Jak czytać tę deklarację? Czy istnieje określony zestaw zasad czytania złożonych deklaracji?
właśnie przeżywa pewnego kodu w Internecie i znalazłem to:Complex deklaracja C
float * (*(*foo())[SIZE][SIZE])()
Jak czytać tę deklarację? Czy istnieje określony zestaw zasad czytania złożonych deklaracji?
I nie zrobili tego w najbliższym czasie!
Zacznij od foo
i przejdź w prawo.
float * (*(*
foo()
)[SIZE][SIZE])()
foo jest funkcja bez argumentów ...
Nie można iść w prawo, ponieważ istnieje nawias zamykający.Idź w lewo:
float * (*(
* foo()
)[SIZE][SIZE])()
foo jest funkcja bez argumentów powrocie wskaźnik
nie może iść w lewo dalej, więc niech krzyż nawiasy i przejść jeszcze raz w prawo
float * (*
(* foo())
[SIZE][SIZE])()
float * (*
(* foo())[SIZE]
[SIZE])()
float * (*
(* foo())[SIZE][SIZE]
)()
foo jest funkcja bez argumentów powracających wskaźnik do tablicy tablic wielkości rozmiarze ...
Zamknięcie nawias osiągnął , ponownie w lewo, aby uzyskać symbol wskaźnika:
float * (
*(* foo())[SIZE][SIZE]
)()
foo jest funkcja bez argumentów powracających wskaźnik do tablicy tablic wielkości wskaźników rozmiar do ...
Lewy nawias ponownie, więc go przejechać idź w prawo i znowu:
float *
(*(* foo())[SIZE][SIZE])
()
float *
(*(* foo())[SIZE][SIZE])()
foo jest funkcja bez argumentów powracających wskaźnik do tablicy tablic wielkości wskaźników wielkością do funkcji bez argumentów ...
i lewo do końca
float * (*(* foo())[SIZE][SIZE])()
foo jest funkcja bez argumentów powracających wskaźnik do tablicy tablic wielkości wskaźników wielkością do funkcji bez argumentów powracających wskaźnik do pływaka
A kto napisał, że należy nauczyć go używać typedef
:
// Function that returns a pointer to float
typedef float* PFloatFunc();
// Array of pointers to PFloatFunc functions
typedef PFloatFunc* PFloatFuncArray2D[SIZE][SIZE];
// Function that returns a pointer to a PFloatFuncArray2D
PFloatFuncArray2D* foo();
+1 za "I ktokolwiek to napisał, p dzierżawa uczy go używać typedef " –
Zauważ, że część" brak argumentów "jest poprawna tylko dla C++; dla C oznacza to "nieokreśloną listę argumentów" (ale nie może być funkcją variadyczną, ponieważ muszą one mieć pełen zakres prototypu, nawet w C). –
Generalnie można spróbować cdecl.org ale trzeba by zastąpić SIZE
Załóżmy, zamienić SIZE
za 12, to otrzymasz:
Declare foo jako wskaźnik do funkcji powrocie tablicy 12 tablicy 12 z kursor do funkcji zwracający wskaźnik do float
Nie jestem pewien, czy to naprawdę pomaga!
Dwie obserwacje tutaj:
Wynika to z "ROZMIARU", zamiast tego należy użyć literału (i zastąpić go stałą po) –
ZMIENIAJ SIZE z pewną liczbą !! – Kaunteya
Odpowiedź została zmieniona - dziękujemy za Twoją opinię –
Według cdecl.org
declare foo w funkcji powrotu wskaźnik do rozmiaru matrycy rozmiar tablicy od wskaźnika do Funkcja zwraca wskaźnik unosić
użyć reguły spirali danej przez Luchian Grigore jeśli chcesz go rozszyfrować ręcznie.
deklaruje foo jako funkcję powracającego wskaźnik rozmiar tablicy o rozmiarze matrycy wskaźnik funkcjonować powrocie wskaźnik unosić
najlepszą rzeczą do zrobienia jest konwersja do serii typedefs.
typedef float * fnReturningPointerToFloat();
typedef fnReturningPointerToFloat* fnArray[SIZE][SIZE];
fnArray* foo();
Zajęło mi to ponad minutę. – QuentinUK
standardowa zasada: znaleźć skrajnie lewą identyfikator i swój sposób pracy na zewnątrz, pamiętając, że []
i ()
wiążą przed *
:
foo -- foo
foo() -- is a function
*foo() -- returning a pointer
(*foo())[SIZE] -- to a SIZE-element array
(*foo())[SIZE][SIZE] -- of SIZE-element arrays
*(*foo())[SIZE][SIZE] -- of pointers
(*(*foo())[SIZE][SIZE])() -- to functions
* (*(*foo())[SIZE][SIZE])() -- returning pointers
float * (*(*foo())[SIZE][SIZE])(); -- to float
Więc wyobraź sobie, że mają kilka funkcji powracających wskaźniki do float
:
float *quux();
float *bar();
float *bletch();
float *blurga();
Załóżmy, że chcesz je przechowywać w tabeli 2x2:
float *(*tab[SIZE][SIZE])() = {quux, bar, bletch, blurga};
tab
jest wielkość x rozmiar tablicy wskaźników do funkcji powracających wskaźniki do float
.
Teraz zdecydować chcemy funkcja zwraca wskaźnik do tej tabeli:
float *(*(*foo())[SIZE][SIZE])()
{
static float *(*tab[SIZE][SIZE])() = {quux, bar, bletch, blurga};
return &tab;
}
Należy zauważyć, że można mieć kilka funkcji, które budują tabele o różnych funkcjach, lub zorganizować te same funkcje, inaczej:
float *(*(*qwerbl())[SIZE][SIZE])()
{
static float *(*tab[SIZE][SIZE])() = {blurga, bletch, bar, quux};
return tab;
}
który jest jedynym powodem, dla którego mogę wymyślić coś takiego. Nie powinieneś często widzieć takich typów na wolności (chociaż pojawiają się one sporadycznie, a ja jestem winny pisania czegoś równie haniebnego).
qwerbl? Prawie zabrakło ogólnych nazw zmiennych, czyż nie :-) +1 dla uzasadnienia. Jestem pewien, że typy "głęboko powiązane" pojawiają się dość często, ale zazwyczaj obejmują także struktury lub klasy, co sprawia, że problem nazewnictwa znika naturalnie - tak jak tu, w przypadku wprowadzania niektórych typów. – Kos
@Kos: yup. Nie miałem jeszcze mojego RDA kofeiny, nie mogłem wymyślić nic lepszego. –
Wikipedia ma [listę zmiennych metakintaktycznych] (http://en.wikipedia.org/wiki/Metasyntactic_variable#English), więc nie zabraknie: foo, bar, baz, qux, quux, corge, grault, garply , waldo, fred, plugh, xyzzy, thud. –
Niniejszy dokument Gaves mi najlepszą pojęcia o tym, jak łatwo gotowy Każda deklaracja C:
http://c-faq.com/decl/spiral.anderson.html
Są trzy proste kroki do naśladowania:
Począwszy nieznane element, poruszaj się spiralnie/zgodnie z ruchem wskazówek zegara; kiedy ecountering następujące elementy zastąpić je odpowiednimi angielskim stwierdzeń:
[X]
lub[]
=> Array X wielkość ... lub Array niezdefiniowany rozmiar ...
(type1, type2)
=> funkcja mijania type1 i type2 powrocie ...
*
=> wskaźnik (ów) ...Wykonuj te czynności spiralnie/zgodnie z ruchem wskazówek zegara, aż wszystkie żetony zostaną zakryte.
Najpierw usuń wszystko z nawiasów!
przykład:
+-------+
| +-+ |
|^| |
char *str[10];
^^ | |
| +---+ |
+-----------+
Question we ask ourselves: What is str?
``str is an...
- We move in a spiral clockwise direction starting with `str' and the first character we see is a `[' so, that means we have an array, so...
``str is an array 10 of...
- Continue in a spiral clockwise direction, and the next thing we encounter is the `*' so, that means we have pointers, so...
``str is an array 10 of pointers to...
- Continue in a spiral direction and we see the end of the line (the `;'), so keep going and we get to the type `char', so...
``str is an array 10 of pointers to char''
We have now ``visited'' every token; therefore we are done!
[zasada spirala] (http://c-faq.com/decl/spiral.anderson.html) –
http://cdecl.org/ – juanchopanza
użyj http://cdecl.org/ – 999k