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;
};
38
demandé sur splicer 2010-10-19 08:13:36

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.

62
répondu R.. 2010-10-19 04:23:05

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;

1
répondu Eric Towers 2014-11-06 18:30:55