2017-01-09 1 views
0

Le code ci-dessous permet d'implémenter vtable.Présentation de la syntaxe C pour les pointeurs de fonction

Dans le code ci-dessous,

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; 

Je ne comprenais pas mentionner (*A) comme pointeur de fonction dans void (*A)(struct A*); qui est membre A_functable, où A est

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

Comment pour comprendre cette syntaxe?

+2

De la même manière que vous lisez les deux autres pointeurs de fonction, juste qu'il s'appelle 'A'. – user2357112

+4

'A' dans' A_functable' est complètement séparé du nom de type 'A' que vous introduisez plus tard. Pour éviter toute confusion, l'auteur aurait dû utiliser un nom différent: –

+0

probablement une question de test/devoirs ... – Rafael

Répondre

2

Dans

void (*A)(struct A*); 

, le premier A ne se réfère pas typedef struct A { ... } A comme cela est seulement défini ci-après. À ce stade, le compilateur ne sait rien d'un type appelé A. A est simplement le nom du membre struct, tout comme update et access.

(struct A ne se réfère à la struct, cependant: Il y a une déclaration struct A; plus haut.)

0

Ils sont différents namespaces.

En C il y a quatre espaces de noms différents

  • Tags pour un struct/union/ENUM
  • membres de struct/syndicat (en fait un espace de noms distinct est attribué à chaque struct/union)
  • Labels
  • Identificateurs ordinaires.

(section 6.1.2.3 de C90)

Identifiers dans différents espaces de noms n'entrer en conflit avec un autre et sera désigné comme des entités distinctes.

Ainsi, dans votre cas,

  • Le membre de la structure, (*A) étant un pointeur de fonction est dans le second espace de noms.
  • Les balises de la structure typedef struct A se trouvent dans le premier espace de noms,
  • Le type struct étant un identificateur ordinaire se trouve dans le quatrième espace de noms.
  • En outre, le type de fonction pour le pointeur de fonction (*A)(struct A*) se trouve dans le quatrième espace de noms, étant un type ordinaire.
+0

"objet" signifie une zone de stockage, pas un identifiant. Certains objets ont des identifiants associés –