2016-12-13 2 views
4

Ich versuche, c zu lernen, also habe ich versucht, etwas Quellcode zu lesen.
Aber ich habe keine Ahnung, was das bedeuten könnte:Array als Funktion mit Argumenten?

static const char*(*const functab[])(void)={ 
     ram,date 
}; 

Der erste Teil, static const char* ist in Ordnung, da es sich um eine Funktion zu sein scheint (hat ein Argument vom Typ void) sollte static bedeuten, dass es nur sichtbar in dieser Datei und const char* sollte bedeuten, dass der Wert nicht geändert werden kann, aber die Adresse kann geändert werden.
Aber in diesem Fall ist es nicht sinn nach dem letzten Teil nach den Funktionsnamen machen, wie es der Fall mit

static const char * date(void); 
static const char * ram(void); 

Statt des Funktionsnamen dort (*const functab[]) war, ein const Array functab enthält genannt ist Adressen?
Ist dies eine Art Wrapping-Funktion mit den Funktionen RAM und Datum? Eine alternative Möglichkeit, Arrays zu deklarieren?

+0

Dies könnte helfen: http: // cdecl.org/. – paulotorrens

+0

@paulotorens Nein, es ist nicht möglich, diese Seite ist ziemlich dumm. Versuchen Sie den vollkommen feinen Code im Beispiel des OP und Sie erhalten "Syntaxfehler". Ich nehme an, sie beziehen sich auf einen Syntaxfehler im Quellcode von cdecl.org ... – Lundin

+0

Stellt sich heraus, dass cdecl.org das statische Schlüsselwort nicht erkennt. Wie erbärmlich. – Lundin

Antwort

2

Kurze Antwort: Hier functab ist ein Array von Funktionszeigern, und das Array mit Zeigern auf Funktionen initialisiert ram und date. Dies erklärt auch den Namen functab, der wahrscheinlich von "FUNCtion TABle" stammt.

Lange Antwort: In C können Sie einen Zeiger auf eine Funktion erhalten und in einer Variablen speichern. Eine auf diese Weise verwendete Variable ist als Funktionszeiger bekannt.

Zum Beispiel funcptr Variable unten wird die Adresse des do_stuff ‚s Einstiegspunkt enthalten:

int do_stuff(const char* x) { ...do stuff.. } 
... 
ftype_t funcptr = &do_stuff; 
... 
(*funcptr)("now"); // calls do_stuff() 

Dies funktioniert nur, wenn Sie bereits über die Art der funcptr definiert haben, die ftype_t hier. Die Typdefinition sollte diese Form annehmen:

typedef int (*ftype_t)(const char*); 

In Englisch bedeutet dies ftype_t wird als eine Art von Funktion, die definiert ist const char* als einziges Argument verwendet und int.

Wenn Sie typedef dies nicht wollen, dass nur für Sie die gleiche Sache haben könnten, indem Sie unten erreicht:

int (*funcptr)(const char*) = &do_stuff; 

Dies funktioniert, aber die Syntax ist verwirrend. Außerdem wird es ziemlich hässlich, wenn Sie versuchen, etwas wie das Erstellen eines Arrays von Funktionszeigern zu machen, was genau Ihr Code tut.

unten gezeigt entspricht Code, der viel einfacher zu verstehen ist: (. Die & (Adresse) in der Regel ist optional, wird aber empfohlen)

typedef static const char*(*myfn_t)(void); 

const myfn_t functab[] = { &ram, &date }; 

4

functab ist ein Array von Funktionszeigern (Array von const Funktionszeiger, um genau zu sein), die const char* zurückgibt und keine Argumente akzeptiert.

Später

... = { ram, date }; 

ist eine Verstrebung umschlossene Initialisiererliste, die für das Array als Initialisierer dient.

+0

Nur um zu klären, sollte das nicht sein: 'functab' ist und Array von * constant * Funktionszeigern ...? – babon

3

Dies ist die Art, Array von Funktionszeigern in C zu definieren. Anstatt also die Funktion als ram() aufzurufen, können Sie dieses Array unter (* functab[1]) aufrufen.

Unten Diskussion hat gute Beispiele für Array von Funktionszeigern: How can I use an array of function pointers?

Verwandte Themen