Irgendeiner Weise in C, um vorwärts zu deklarieren struct in header ohne Zeiger, die in anderen Dateien?
Denke, ich habe dies in der Liste.h:
typedef struct list_t list_t;
typedef struct list_iter_t list_iter_t;
list_iter_t iterator(list_t *list);
dann definieren Sie in der Liste.c:
typedef struct node_t {
...
} node_t;
struct list_iter_t {
node_t *current;
//this contains info on whether the iterator has reached the end, etc.
char danger;
};
struct list_t {
...
}
list_iter_t iterator(list_t *list) {
list_iter_t iter;
...
return iter;
}
Gibt es irgendetwas, was ich tun kann, abgesehen von einschließlich der struct-Deklaration in der header-Datei, so dass in einigen Datei testen.c ich kann:
#include "list.h"
void foo(list_t *list) {
list_iter_t = iterator(list);
...
}
Möchte vielleicht sagen, der compiler die Größe des Speichers von list_iter_t irgendwie? Es unbequem zu haben, um mit einem Zeiger (nicht weil es ein Zeiger, aber aus anderen Gründen), aber zur gleichen Zeit ich möchte zu verstecken die details der Implementierung, so viel wie möglich.
- Werden Sie gefragt, ob Sie erklären können, variable, deren Typ ist unvollständig? Das können Sie nicht.
- Nein gibt es nicht. Sie können nicht erklären, ein unvollständiger Typ ist. Auch deine typedefs sind falsch. Sie sollten
typedef struct list_t list_t; typedef struct list_iter_t list_iter_t;
. Denken Sie an es auf diese Weise, wenn was Sie sich wünschen möglich wäre, würde es keine solche Sache wie ein opaker Typ in C. Jemand versucht zu verbergen das Innenleben einer struct von Ihnen, indem wir Ihnen nur einen header mit einer forward-Deklaration und eine Bibliothek, die zusammen mit ihm geht, könnten Sie einfach deklarieren Sie eine Instanz in Ihrem code und verwenden Sie es. - Okay danke. (Das fehlen von "struct" in die typedef-war ein Tippfehler.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die lapidare Antwort "Nein".
Den Weg sagen Sie dem compiler die Größe eines
struct
ist, indem Sie sagen, es die details, wie diestruct
strukturiert ist. Wenn Sie möchten, reservieren Sie ein Objekt, sondern einen Zeiger auf das Objekt, muss der compiler wissen, die komplette Art des Objekts. Sie kann auch nicht auf die Mitglieder einer Struktur über einen Zeiger auf die Struktur, wenn der Typ unvollständig ist. Das heißt, der compiler muss wissen, offset und Typ der das Mitglied den korrekten code generieren, um Zugangsomeptr->member
(sowie reservierensomevalue
oder Zugangsomevalue.member
).Es ist möglich, dem compiler die Größe der Struktur, die Verwendung einer dummy-definition:
(mit der richtigen definition, anstatt zur Verfügung, um die Umsetzung-Datei).
Formal dies bewirkt Undefiniertes Verhalten; es ist wahrscheinlich etwas in der Praxis funktionieren, obwohl.
Sind Sie wahrscheinlich am besten aus, nur inklusive der richtigen Struktur definition wenn und hinterlassen Sie einen Kommentar ein, der Effekt, der code sollte einfach nicht berühren Sie die internen Mitglieder.
union
von der fake-Typ und eine wirkliche Struktur?union {unsigned long data[50];} FOO;
und die .C-Datei hatunion {unsigned long data[50]; REAL_STRUCTURE dat;} FOO;
würde Verhalten definiert werden, vorausgesetzt, dass die Größe und Ausrichtung Anforderungen derdat
waren nicht größer als die desdata
?unsigned char[]
würde einen Zeiger auf eine unionunsigned char[]
gültig, da ein Zeiger auf die andere union [ich denke, es würde gelten als einen Zeiger auf die andere unionunsigned char[]
, und ich denke, ein Zeiger auf die union unsigned char[] gelten als Zeiger auf die union].unsigned char
auf einen Zeiger auf eine union, auch wenn der union enthält eineunsigned char
Mitglied. Wenn du nicht überzeugt bist vielleicht sollten Sie diese Frage als eine neue Frage, damit es ein paar mehr Augen.char[]
würde garantieren, dass könnte man sicher memcpy (), die eine auf die andere, aber keine overlay über Zeiger. Eine Implementierung könnte theoretisch z.B. eine schnelle Bereich des RAM, das zugänglich war, die CPU aber nicht die FPU und könnten in einem solchen Bereichstruct
oderunion
statische oder automatische Dauer, die nicht enthalten keine floating-point-zahlen (malloc
nicht nutzen konnte, die Gegend, obwohl). Gegeben ein Zeiger auf eine Raum zurückgegebenmalloc
oder einer union, die "rechtmäßig" enthält einen Schwimmer, man könnte den Zugang floating-point-zahlen in ihm.float
gespeichert, die innerhalb einer union, deren Platz wurde statisch oder automatisch zugeordnet, wenn eine Art, die nicht enthalten keine floating-point-Typen. Während ich weiß nicht, Maschinen oder Compiler, welche gemeinsam implementieren, die bestimmte Einschränkungen, die ich beschrieben habe, ich denke so etwas legal wäre unter der Norm. Verstehe ich richtig? (Ich mag zu denken, der UB in Bezug auf die Dinge, die eine Implementierung erlaubt wäre, das zu tun, würde die Ausbeute zu unerwünschten Ergebnissen).