2009-10-09 9 views
1

J'ai le code dans mon fichier d'en-tête qui ressemble à:Comment définissez-vous un tableau struct opaque dans C?

typedef struct _bn bnode; 

Je peux faire

bnode b; 

très bien, mais

b[i], où i est un entier me donne l'erreur suivante :

utilisation non valide du type indéfini 'struct _bn'

Des idées?

+6

Vous ne devriez pas pouvoir écrire même un seul «bnode b;» car le compilateur ne sait pas combien d'espace allouer. Vous seriez capable d'écrire '' bnode * bp; '', cependant. –

Répondre

1

En ce qui concerne une API/bibliothèque va, normalement si vous allez avoir besoin d'une structure opaque, vous ne permettent pas à l'utilisateur de l'API pour déclarer des choses comme des tableaux ou des instances statiques à cause de cela. Ne sachant rien de la structure est le nom du jeu donc vous allez probablement devoir définir certaines fonctions pour les manipuler. La plupart des bibliothèques C qui déclarent des structures opaques ont souvent des fonctions d'accès et de modification.

Un exemple est de Lua (évidemment un état Lua est une structure à usage unique mais il est l'idée):

typedef struct lua_State lua_State; 
void lua_pushnumber(lua_State *s, lua_Number n); 

Dans ce cas, si vous avez décidé que vous aviez besoin de multiples états Lua, vous feriez quelque chose comme les éléments suivants:

lua_State *states[5]; 
for(int i = 0; i < 5; i++) 
    states[i] = lua_open(); 

Je pense que la règle générale de pouce est que si vous travaillez avec des structures opaques, vous allez travailler par le biais des pointeurs seulement, ce qui est à peu près la seule façon d'aller à ce sujet de toute façon.

1

Semble comme vous voulez une implémentation opaque pointer/PIMPL, ou vous devez inclure le fichier d'en-tête approprié.

Les structures en C++ sont presque identiques aux classes, donc les mêmes techniques s'appliquent.

+0

Je préfère ne pas utiliser un pointeur opaque de la manière décrite dans cet article, car cela pourrait confondre l'utilisateur de la fonction en pensant que c'est un type de valeur. – joemoe

3

Comme indiqué, b n'est pas un tableau et, en tant que tel, ne peut pas être accédé comme un.

De même, comment voulez-vous que le compilateur calcule la taille de cette structure? Lorsque vous faites quelque chose comme bnode b[i] une certaine quantité d'espace doit être mis de côté pour une utilisation ultérieure. Comme vous l'avez il n'y a pas de taille.

Quelle est votre opacité destinée à faire pour vous? Peut-être que si vous expliquez plus loin ce que vous essayez d'accomplir, vous obtiendrez une réponse plus révélatrice ...

+0

Oui, vous avez raison. J'ai réalisé que sizeof() n'est pas vraiment possible et que b [i] ne peut pas fonctionner. – joemoe

+0

Ah, j'avais interprété les parenthèses comme un opérateur surchargé []. – tfinniga

+0

@joemoe Vous pourriez envisager d'utiliser quelque chose comme un «void *» ou des mécanismes similaires. – ezpz

0

Vous devez au moins connaître la taille de bnode pour pouvoir en faire un tableau.

Vous pouvez le faire, dans la définition opaque de bnode:

typedef struct bnode_struct { 
    uint8_t opaque_bytes[1024]; /* magically just "know" how big it is. */ 
} bnode; 

Ensuite, vous pouvez faire:

bnode b[10]; 

et cela fonctionnera.

+0

Cela pourrait fonctionner. mais 'bnode' pourrait ne pas avoir la même exigence d'alignement que la version non-opaque de la structure, voir ma question/réponse pour plus d'informations à ce sujet: http://stackoverflow.com/questions/17619015/why-you-should-not -hide-structure-implementation-that-way – ydroneaud

1

Vous ne pouvez pas définir un tableau de structures opaques. Si vous ne vous obtenez une erreur comme:

error: array type has incomplete element type

(le texte d'erreur spécifique variera, celui ci-dessus est de gcc 4.4.1).

Mais ce que vous pouvez faire est de créer un tableau de pointeurs vers des structures opaques. Cela est possible car les détails de la structure n'affectent pas la taille du pointeur.

typedef struct _bn bnode; 
bnode *b[20]; 
+0

C'est la manière habituelle d'opérer sur des structures opaques. – caf

Questions connexes