2015-08-11 10 views
16

Mój podstawowy język programowania, , został niedawno otwarty. Aby to poprawić, badam źródło, które jest napisane w C.Co oznacza typedef A (* AF)()?

Ale to był długi (!) Czas od kiedy przeczytałem lub napisałem C, a nie byłem nawet dobry w tym następnie. A sposób w jaki napisana jest ta część kodu jest ... idiosynkratyczny (wielu interpretatorów APL, wśród których J ma swoje źródło napisane w "stylu APL" na wysokim poziomie, nawet gdy jest napisane w języku niskiego poziomu, bardzo zwięzłe, , intensywne używanie makr itp.)

W tej chwili staram się zrozumieć podstawowe struktury danych, które zatrudnia. Najbardziej podstawowym z nich jest the typedef A ("A" jest dla "array"):

typedef struct {I k,flag,m,t,c,n,r,s[1];}* A; 

co rozumiem dobrze. Ale ja stara się owinąć głowę wokół co AF ma dwie linie później:

typedef A (*AF)(); 

Co to składnia oznacza? W szczególności, co to znaczy, gdy rzeczy są później zadeklarowane jako "typ AF"? Czy AF jest po prostu wskaźnikiem do A?

Moja bezpośrednim celem jest interpretacja zrzuty pamięci, które obejmują rzeczy type V (dla „verb”), której pierwsze dwa człony są AF s:

typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V; 

ale moim nadrzędnym celem jest większy niż ten, więc proszę opracować składnię stosowaną w definicji AF.

+5

'AF' jest wskaźnikiem do funkcji, która nie przyjmuje parametrów i zwraca' A'. – dasblinkenlight

+8

@dasblinkenlight: Tak jest w C++. W C jest to typedef dla funkcji o nieokreślonej, ale ustalonej liczbie i typie parametrów i zwraca 'A'. Bardzo prawdopodobne, że * powinno * być zdefiniowane jako 'typedef A (* AF) (void);'. Jeśli naprawdę ma przyjmować dowolną liczbę argumentów, bardzo łatwo można mieć niezdefiniowane zachowanie, wywołując funkcję niepoprawnie, bez diagnostyki kompilatora. –

+7

Baza kodu jest okropna. Powinieneś uciekać, krzycząc. – Hogan

Odpowiedz

13

Jak już odpowiedział AF (Array Funkcja) to wskaźnik do funkcji, która zwraca A (Array obiekt wskaźnik).

W definicji V (czasownik, tj. Obiekt funkcji), są dwa AF s. v1 jest wskaźnikiem do implementacji funkcji monadycznej, a v2 jest wskaźnikiem do funkcji diadycznej.Jeśli operator V reprezentuje operatora (przysłówek), to nadal są to implementacje monadyczne i dynamiczne, ale także fg i h mogą być używane do przechowywania (curry) lewego i/lub prawego argumentu. mrlr i rr są odpowiednio monadyczną, lewą i prawą. I id posiada kod opcode, więc drukowana reprezentacja nadal może być odzyskana ze struktury.

Jeśli którykolwiek z argumentów w fg lub h same są czasowniki ich V struktura będzie co f-> k bajty obok * F, odpowiednio g i h, podobnie jak wszystkie „ładunku danych”.

Bardzo przydatnym linkiem, który znalazłem w celu zrozumienia podstawowych typów w implementacji J jest Roger Hui BAA talk notes (skanowany plik pdf 2.69M). Pełna wersja to: Implementation of J (html).

Możesz również dowiedzieć się, my primitive clone pouczające. Zobacz także moje pytania: here i here.

+0

Niesamowite, bardzo specyficzne dla moich potrzeb (zastanawiałem się nad 'f',' g', 'h'). Dzięki. Rzucę okiem na notatki BAA i twój klon. Doceń pomoc. –

+0

Zaakceptowałem twoją odpowiedź, chociaż była późniejsza niż inne, ponieważ zawiera ona najwięcej szczegółów specyficznych dla mojego projektu (warto wspomnieć, że udało mi się przegłosować wszystkie zamieszczone odpowiedzi). –

13

AF jest typedef dla wskaźnika funkcji. W szczególności, AF odnosi się do wskaźnika do funkcji, która przyjmuje nieokreśloną liczbę parametrów i zwraca wynik typu A.

+0

Ah, oczywiście. Ma to również sens w kontekście "V", które są funkcjami, które przetwarzają 'A's (i zwracają' A's). Dzięki. Przyjmę to, gdy system mi pozwoli. –

+0

To jest wskaźnik do funkcji z 0 argumentami. Wskaźniki funkcji o zmiennej liczbie argumentów używają składni "...". – rlbond

+0

@rlbond Nie, funkcja z 0 argumentami ma '(void)' jako listę parametrów; będzie to "typedef A (* AF) (void)". Odpowiedź jest poprawna: to nieokreślona liczba parametrów. –

12

Zignorujmy to, co faktycznie jest A. Trzeba wówczas

typedef int (*AF)(); 

AF jest wskaźnikiem do funkcji (vel wskaźnik funkcji), który trwa dowolną liczbę argumentów i zwraca int. Oczywiście, zamieniając int na A, zawartość jest zasadniczo taka sama, z wyjątkiem zwracanego typu; wynik końcowy kwalifikuje zatem AF jako wskaźnik do funkcji przyjmowania dowolnej liczby argumentów i zwracania A, aliasu dla wskaźnika do anonimowej struktury.

Istnieje strona interesting, która może pomóc w przekształcaniu złożonych deklaracji w tekst czytelny dla człowieka.

+0

Nice. Dziękuję w szczególności za link do cdecl.org: prawdopodobnie potrzebuję go do tego projektu. –

+4

@DanBron: Istnieje również program 'cdecl', który możesz zainstalować. W przypadku Linuksa wystarczy zainstalować pakiet 'cdecl'. W przypadku innych systemów operacyjnych możesz prawdopodobnie zbudować go ze źródła. –