Een pointer array van voorwaartse aangegeven structuren C

stemmen
1

Ik heb een vraag over op de toekomst verklaringen in C. Het probleem code is

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

Nadat de code is gecompileerd met gcc, klaagt:

error: arraytype heeft onvolledig elementtype 't_yhash' {aka struct yhash_s '}

Ik begrijp dat t_yhash wordt niet weet (nog) en de grootte van de array kan niet worden berekend, maar ik vraag over pointer naar een array van onbekende nog omvang, die perfect resolvable IMHO zou moeten zijn.

Hoe kan ik dit oplossen die naar voren verklaring en struct zelf?

De vraag is gesteld op 13/01/2020 om 23:59
bron van user
In andere talen...                            


2 antwoorden

stemmen
4

Het probleem is dat de matrix declarators mag geen incomplete als elementtype (C11 6.7.6.2/1) hebben. En t_yash(dus struct yhash_s) niet compleet is, totdat de accolade sluiten van de structuur definitie.

Deze regel is ook verantwoordelijk voor een ander stuk van trivia; het is legaal te hebben (voor de structuur definitie is voltooid):

void func( t_yhash *a );

maar niet juridisch te hebben:

void func( t_yhash a[] );

hoewel de aanpassing regel prima, zo niet zou werken voor het onvolledige element type regel.

Waarschijnlijk is de taal ontwerp kan enigszins worden verbeterd door aanscherping van deze regel aan sommige gevallen, zoals de functie prototype mogelijk te maken, maar het was duidelijk niet iets dat is ontstaan ​​met de taal ontwerp commissie.

Maar ook zonder deze regel, kan uw use case een ander probleem; de grootte van de aanwijzer kan niet gekend worden. Het zou legaal (alhoewel waarschijnlijk praktisch) voor "pointer array van struct X" naar een ander formaat dan "pointer array van struct J". Er is een regel dat alle verwijzingen naar struct moeten dezelfde grootte hebben, maar geen dergelijke regel voor verwijzingen naar array.

antwoordde op 14/01/2020 om 00:24
bron van user

stemmen
0

In antwoord op dit deel van uw post:

Hoe kan ik dit oplossen die naar voren verklaring en struct zelf?

U kunt gebruiken void *om uw array stash, en zet het dan later nog eens.

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;
}

Als de syntaxis van de functie is te stompe:

typedef t_yhash t_yhash_array[];

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

Bijvoorbeeld:

t_yhash x[10];
t_yhash y = { 10, &x };
assert(yhash(y) == &x);
antwoordde op 14/01/2020 om 01:38
bron van user

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