Ein Zeiger auf Array von vorn erklärt Strukturen in C

stimmen
1

Ich habe eine Frage zu Vorwärts-Erklärungen in C. Das Problem Code ist

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

Sobald der Code mit gcc kompiliert wird, klagt sie:

Fehler: Array-Typ hat unvollständige Elementart 't_yhash' {aka 'struct yhash_s'}

Ich tun, dass t_yhash verstehen nicht wissen (noch) und die Größe des Arrays nicht berechnet werden kann, aber ich bitte um Zeiger auf ein Array von unbekannter Größe noch, die perfekt auflösbaren IMHO sein sollte.

Wie behebe ich die Forward-Deklaration und struct selbst?

Veröffentlicht am 13/01/2020 um 23:59
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
4

Das Problem ist , dass Array Deklaratoren keine unvollständigen Typ als Elementtyp (C11 6.7.6.2/1) aufweisen. Und t_yash(dh struct yhash_s) ist erst abgeschlossen , wenn die schließende Klammer der Struktur Definition.

Diese Regel ist auch für ein anderes Stück Trivia verantwortlich; es ist legal zu haben (bevor die Struktur Definition abgeschlossen ist):

void func( t_yhash *a );

aber nicht legal zu haben:

void func( t_yhash a[] );

obwohl würde die Anpassungsregel nur in Ordnung, wenn nicht für die unvollständige Elementtyp Regel arbeiten.

Wahrscheinlich könnte die Sprache Design leicht diese Regel wird verbessert durch Verfeinerung einig Fälle wie der Funktionsprototyp zu ermöglichen, aber es war eindeutig nicht etwas, das mit der Sprache Design Komitee entstand.

Aber auch ohne diese Regel, Ihr Anwendungsfall könnte ein anderes Problem; die Größe des Zeigers nicht bekannt sein könnte. Es wäre (wenn auch unwahrscheinlich, dass in der Praxis) für „Zeiger auf Array von struct X“ hat eine andere Größe als „Zeiger auf Array von struct Y“ legal sein. Es gibt eine Regel, dass alle Zeiger auf die gleiche Größe haben struct müssen, aber keine solche Regel für Zeiger auf Array.

Beantwortet am 14/01/2020 um 00:24
quelle vom benutzer

stimmen
0

Als Antwort auf diesen Teil Ihres Beitrags:

Wie behebe ich die Forward-Deklaration und struct selbst?

Sie können mit void *Ihrem Array beiseite zu schaffen, und es dann später wieder konvertieren.

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

Wenn die Funktion Syntax ist zu stumpf:

typedef t_yhash t_yhash_array[];

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

Beispielsweise:

t_yhash x[10];
t_yhash y = { 10, &x };
assert(yhash(y) == &x);
Beantwortet am 14/01/2020 um 01:38
quelle vom benutzer

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