2017-01-09 2 views
0

Im folgenden Code wird Vtable implementiert.Die C-Syntax für Funktionszeiger verstehen

Im folgenden Code,

struct A; 

typedef struct { 
    void (*A)(struct A*); 
    void (*update)(struct A*); 
    int (*access)(struct A*); 
} A_functable; 

typedef struct A{ 
    int a; 
    A_functable *vmt; 
} A; 

ich nicht (*A) als Funktionszeiger verstehen konnte in void (*A)(struct A*); zu erwähnen, das Mitglied in A_functable ist, wo A

typedef struct A{ 
     int a; 
     A_functable *vmt; 
    } A; 

ist, wie um diese Syntax zu verstehen?

+2

So wie Sie die anderen beiden Funktionszeiger lesen, nur dass es "A" heißt. – user2357112

+4

'A' in' A_functable' ist vollständig getrennt vom Typnamen 'A', den Sie später einführen. Um Verwechslungen zu vermeiden, sollte der Autor einen anderen Namen verwendet haben: –

+0

, wahrscheinlich eine Test-/Hausaufgabenfrage ... – Rafael

Antwort

2

In

void (*A)(struct A*); 

die erste A bezieht sich nicht auf typedef struct A { ... } A so dass nur weiter unten definiert wird. Zu diesem Zeitpunkt weiß der Compiler nichts über einen Typ namens A. A ist einfach der Name des Strukturelements, genau wie update und access.

(struct A nicht auf die Struktur beziehen, aber: Es gibt eine struct A; Erklärung weiter oben.)

0

Sie sind in verschiedenen Namespaces.

In C gibt es vier verschiedene Namensräume

  • Tags für eine Struktur/Union/enum
  • Mitglieder von Struktur/Union
  • Labels (eigentlich einen eigenen Namensraum zu jeder Struktur/Union zugeordnet ist)
  • Gewöhnliche Identifikatoren.

(Abschnitt 6.1.2.3 von C90)

Identifiers in unterschiedlichen Namensräumen wird nicht mit einem anderen, und wird hierin als getrennte Einheiten kollidieren.

Also, in Ihrem Fall

  • Das Mitglied der Struktur, (*A) ein Funktionszeiger zu sein, ist in der zweiten Namespace.
  • Die Tags für die Struktur typedef struct A befinden sich im ersten Namespace,
  • Der Strukturtyp, der ein gewöhnlicher Bezeichner ist, befindet sich im vierten Namespace.
  • Darüber hinaus befindet sich der Funktionstyp für den Funktionszeiger (*A)(struct A*) im vierten Namespace und ist ein gewöhnlicher Typ.
+0

"Objekt" bedeutet eine Speicherregion, keine Kennung. Einige Objekte sind mit Identifikatoren verknüpft –