Les structures c opaques: comment les déclarer?
j'ai vu les deux styles suivants de déclaration des types opaques dans capis. Est-il un avantage évident à l'aide d'un style plus qu'un autre?
Option 1
// foo.h
typedef struct foo * fooRef;
void doStuff(fooRef f);
// foo.c
struct foo {
    int x;
    int y;
};
Option 2
// foo.h
typedef struct _foo foo;
void doStuff(foo *f);
// foo.c
struct _foo {
    int x;
    int y;
};
2 réponses
mon vote est pour la troisième option que mouvicien a posté puis supprimé:
j'ai vu une troisième voie:
// foo.h struct foo; void doStuff(struct foo *f); // foo.c struct foo { int x; int y; };
 si vous ne pouvez vraiment pas supporter de taper le mot-clé struct , typedef struct foo foo;  (note: débarrassez-vous de l'underscore inutile et problématique) est acceptable. Mais quoi que vous fassiez,    jamais    utilisez  typedef  pour définir les noms pour les types de pointeur. Elle cache l'extrême importance l'information que les variables de ce type font référence à un objet qui pourrait être modifié chaque fois que vous les passez à des fonctions, et il rend traiter différemment-qualifié (par exemple,  const  -qualifié) des versions du pointeur une douleur majeure.  
   bar(const fooRef)  déclare une adresse immuable comme argument.    bar(const foo *)  déclare une adresse d'un foo immuable comme argument.  
  Pour cette raison, j'ai tendance à préférer l'option 2.  C'est-à-dire: le type d'interface présenté est celui où cv-ness peut être spécifié à chaque niveau d'indirection.  Bien sûr, un  peut  contourner l'option 1 rédacteur de bibliothèque et juste utiliser  foo , vous ouvrant à toutes sortes d'horreur quand l'auteur de bibliothèque change application.  (C'est-à-dire, l'auteur de l'option 1 de la bibliothèque ne perçoit que  fooRef fait partie de l'interface invariante et que foo  peut venir, aller, être modifié, quoi que ce soit.  L'auteur de l'option 2 perçoit que  foo  fait partie de l'interface invariante.)  
  je suis plus surpris que personne n'ait proposé de constructions combinées typedef/struct.  
      typedef struct { ... } foo;