type incomplet avec la taille

voix
1

J'écris une bibliothèque C et une struct qui ressemble (à peu près) comme:

struct Obj {
    char tag,
    union { 
        int i,
        void *v
    } val
};

Je ne veux pas exposer les entrailles de cette structure à travers l'API, parce que les utilisateurs ne ont pas besoin de connaître la mise en œuvre et ils pourraient changer dans les futures versions. Les utilisateurs peuvent interagir avec le struct via des fonctions de l'API.

J'ai utilisé les types incomplets dans l' en- tête pour d' autres types plus grands dans mon API qui ne sont accessibles que via le pointeur par l'utilisateur. Je ne veux pas restreindre les utilisateurs à accéder Objvia le pointeur, comme Objsera probablement seulement 16 octets maximum.

Je n'ai pas été en mesure d'utiliser un type incomplet ici, parce que je ne sais pas d'un moyen d'exposer seulement la taille de la struct aux utilisateurs, sans champs.

Ma question est: Y at-il un moyen d'exposer un type avec la taille que dans C (aucune connaissance des champs de la struct donnée à l'utilisateur), un autre hack pour accomplir ce que je veux, ou devrais-je mettre en œuvre ce d'une manière complètement différente ?

S'il vous plaît commentaire si je ne l'ai pas fourni suffisamment de détails ou quoi que ce soit ne sait pas.

Créé 20/10/2018 à 03:26
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Le modèle standard pour cela est de créer une fonction qui alloue la structure pour l'utilisateur:

struct Obj* obj_new(void) {
  return malloc(sizeof(struct Obj));
}

Ensuite, il suffit de laisser le type incomplet dans votre tête publique.

Bien sûr, si vous voulez vraiment exposer seulement la taille, vous pouvez simplement créer une fonction qui retourne sizeof(struct Obj). Il est évident que les gens peuvent faire un mauvais usage (par exemple, hardcoding la valeur dans leur code comme une « optimisation » pour éviter d' appeler cette fonction), mais ce n'est pas sur vous. Il est quelque chose qui se fait de temps en temps, généralement pour faciliter l' héritage.

Créé 20/10/2018 à 03:30
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more