A mutató tömb előre bejelentett struktúrák C

szavazat
1

Van egy kérdés előre nyilatkozatok C. A probléma kód

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

Ha a kódot gcc azt kifogásolja:

hiba: tömb típus van hiányos elem típusa „t_yhash” {aka „struct yhash_s”}

Értem, hogy t_yhash nem tudja (még) és méretű tömb nem lehet kiszámolni, de kérem körülbelül mutató tömb ismeretlen még méret, ami tökéletesen megoldható IMHO.

Hogyan javíthatom hogy előre nyilatkozata és struct magát?

A kérdést 13/01/2020 21:59
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
4

A probléma az, hogy tömb declarators nem lehet hiányos típusú, mint az elem típusa (C11 6.7.6.2/1). És t_yash(vagyis struct yhash_s) nem teljes, amíg a záró zárójel a struct meghatározás.

Ez a szabály is felelős egy darab trivia; ez legális, hogy (még a struct meghatározás kész):

void func( t_yhash *a );

de nem törvényes, hogy:

void func( t_yhash a[] );

bár a kiigazítás szabály működne csak finom, ha nem a teljes elem típusa szabályt.

Valószínűleg a nyelvi tervezés javítani lehetne kissé finomításával ez a szabály, hogy egyes esetekben, mint a függvény prototípus, de egyértelműen nem volt valami, ami keletkezett a nyelvi tervezés bizottság.

De még nem ez a szabály, a szolgáltatás használata esetén előfordulhat, hogy egy másik probléma; A méret a mutató esetleg nem ismert. Lenne jogi (bár nem valószínű a gyakorlatban) a „mutató tömb struct X”, hogy egy különböző méretű, mint a „mutató tömb struct Y”. Van egy szabály, hogy minden mutató struct kell azonos méretű, de nincs ilyen szabály mutató tömb.

Válaszolt 13/01/2020 22:24
a forrás felhasználó

szavazat
0

Válaszul ezt a részét a bejegyzést:

Hogyan javíthatom hogy előre nyilatkozata és struct magát?

Használhatja void *rejtjük a tömb, majd konvertálja vissza később.

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

Ha a függvény szintaxisa túl bárgyú:

typedef t_yhash t_yhash_array[];

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

Például:

t_yhash x[10];
t_yhash y = { 10, &x };
assert(yhash(y) == &x);
Válaszolt 13/01/2020 23:38
a forrás felhasználó

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