Un pointeur vers l'avant réseau de structures déclaré en C

voix
1

J'ai une question sur les déclarations avant en C. Le code problème est

typedef struct yhash_s t_yhash;                          // forward declaration
struct yhash_s {
               size_t  size_h; 
               t_yhash (*yhash)[]                        // pointer to array of structures
               };

Une fois que le code est compilé avec gcc, il se plaint:

Erreur: type de tableau a type d'élément incomplet 't_yhash' {alias 'struct yhash_s'}

Je comprends que t_yhash ne sait pas (encore) et la taille du tableau ne peut pas être calculé, mais je demande à propos de pointeur sur un tableau de taille encore inconnu, qui devrait être parfaitement résoluble à mon humble avis.

Comment puis-je corriger cette déclaration en avant et se struct?

Créé 13/01/2020 à 23:59
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
4

Le problème est que les déclarateurs de tableau ne peuvent pas avoir un type incomplet comme le type d'élément (C11 6.7.6.2/1). Et t_yash(c. -à struct yhash_s) n'est pas complète jusqu'à ce que l'accolade de fermeture de la définition de struct.

Cette règle est également responsable d'un autre morceau de trivia; il est légal d'avoir (avant la définition struct est complète):

void func( t_yhash *a );

mais pas légal d'avoir:

void func( t_yhash a[] );

même si la règle d'ajustement fonctionnerait très bien sinon pour la règle de type d'élément incomplet.

Probablement la conception du langage pourrait être légèrement améliorée en affinant cette règle pour permettre certains cas comme le prototype de la fonction, mais il était clairement pas quelque chose qui se pose avec le comité de conception du langage.

Mais même sans cette règle, votre cas d'utilisation pourrait avoir un autre problème; pourrait ne pas être connu de la taille du pointeur. Il serait légal (quoique peu probable dans la pratique) pour « pointeur sur un tableau de struct X » pour avoir une taille différente de « pointeur sur un tableau de struct Y ». Il y a une règle que tous les pointeurs sur struct doit avoir la même taille, mais aucune règle pour des pointeurs sur tableau.

Créé 14/01/2020 à 00:24
source utilisateur

voix
0

En réponse à cette partie de votre message:

Comment puis-je corriger cette déclaration en avant et se struct?

Vous pouvez utiliser void *pour ranger votre tableau, puis le convertir plus tard.

typedef struct yhash_s t_yhash;
struct yhash_s {
               size_t  size_h;
               void *yhash;
               };

static inline t_yhash (*yhash(t_yhash y))[] {
    return y.yhash;
}

Si la syntaxe de la fonction est trop obtus:

typedef t_yhash t_yhash_array[];

static inline t_yhash_array *yhash(t_yhash y) {
    return y.yhash;
}

Par exemple:

t_yhash x[10];
t_yhash y = { 10, &x };
assert(yhash(y) == &x);
Créé 14/01/2020 à 01:38
source utilisateur

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