2010-12-19 3 views
4

Kann mir jemand sagen, was ist der folgende Code? Ist es Funktion Erklärung oder Aussage? Ist es ein gültiger Code?Was ist die Erklärung des Codes?

static void (*const handle_screens[NO_OF_SCREENS]) (void) = 
    { status_screens, settings_screens, access_screens, configuration_screens, 
     history_screens }; 
+1

"Ist es gültiger Code?" kann beantwortet werden, indem man es eintippt und kompiliert, weißt du. Im übrigen scheint es ein Array von Funktionszeigern zu sein, von denen jeder auf eine Funktion ohne Parameter zeigt und entweder einen undurchsichtigen Datentyp ("void *") oder nichts ("void") zurückgibt, das wahrscheinlich als irgendeine Art verwendet wird von Screen-Handler. –

+3

Ich glaube, wenn sie Void zurückgegeben * es wäre void * (* const handle_screens [NO_OF_SCREENS]) (void) – EnabrenTane

+0

Ja, du hast Recht, EnabrenTane. Ich habe nur die Rechts-nach-Links-Regel überprüft. –

Antwort

9

sein eine konstante Array von Funktionszeigern, dass der Unterzeichnung void foo(void)

Diejenigen, die einfach diejenigen sind. Google C Complex Declaration für die aufregenden.

+0

Ist es ein 'void foo (void)' oder ein 'void * foo (void)'? Ich habe die fiese Funktion Pointer-Syntax in diesen Tagen aus den Augen verloren. –

+0

sagte erlaubt. Ein Array von Hinweisen auf Funktionen, die nichtig sind und leer ausgehen .... denke ich. – EnabrenTane

1

Es gibt eine common rule (in der ich gerade meinen Speicher aktualisiert habe), die beschreibt, wie Deklarationen und Definitionen von C dekodiert werden. Befolgen Sie die Anweisungen auf diesem Link Ihre Deklaration ist: handle_screens ist ein statisches Array mit NO_OF_SCREENS Einträge von const Zeiger auf Funktionen ohne Argumente void zurückgeben.

Dieses Array wird mit fünf Funktionen initialisiert, so würde ich wetten, dass NO_OF_SCREENS persönlich 5 ist. Dies bedeutet, dass EnabrenTane korrekt ist, dass die Funktionsdefinitionen void foo(void) sind.

6

Wenn alles andere fehlschlägt und Sie sich nicht 100% ig sicher sind, was eine Deklaration deklariert, sehen Sie sich das Dienstprogramm cdecl an. Es ist ein Linux-Dienstprogramm, aber jemand hat auch ein Web-Interface für ihn unter cdecl.org erstellt. Wählen Sie eine Zufallszahl für die NO_OF_SCREENS #define einfügen und Sie erhalten:

> static void (*const handle_screens[1]) (void); 

declare handle_screens as static array 1 of const pointer to function (void) returning void 

Link to result.

+0

Schöne Seite. Ich werde es verwenden, wenn wieder mit C-Programmierung gesattelt wird. –