Bei der Implementierung eines ADT in C, dachte ich immer, dass die Definition der struct
sollte in der Datei .c
sein, so dass es privat war. Und in der typedef
sollte in der Datei .h
platziert werden, so dass andere Module den ADT verwenden konnten, aber seine Attribute nicht direkt ändern konnten. Ich stieß kürzlich auf ein Problem und ich musste die Struktur in die .h
verschieben. Ich fand auch eine Antwort Error: In C, got the error "dereferencing pointer to incomplete type" in a struct pointer, wo es heißt, dass die struct
in .c
Datei definiert werden sollte. Ist das wahr? Wenn es ist, was ist der Grund?Wo sollte die Definition einer Struktur in C deklariert werden? .c oder .h?
Antwort
Wie ich festgestellt, in einem comment:
Die Strukturdefinition für eine ADT in der Regel in der Quelle (.c
) Datei sein sollte, die die Support-Funktionen definiert, und nur eine Erklärung des Typs sollte im Header vorhanden ist (.h
) Datei.
Das bedeutet jedoch, dass Sie Instanzen der Struktur nicht außerhalb der Quelldatei zuweisen können, die den ADT definiert. Sie können Zeiger nur außerhalb des ADT definieren.
Wenn Sie die Definition von Quelle zu Header verschieben mussten, bedeutet das, dass etwas keinen Zeiger verwendet, der einen Zeiger hätte verwenden sollen. Gehen Sie zurück und beheben Sie den fehlerhaften Code, und verschieben Sie die Strukturdefinition zurück in die Quelldatei für den ADT.
Und bestätigen, was Nevado Hinweise in einem comment, bedeutet es auch, dass Sie nicht ein Array des ADT haben können; Sie können Arrays von Zeigern auf den ADT haben, aber nicht Arrays des ADT selbst.
Beachten Sie, dass es vollkommen legitim ist, die Struktur freizulegen, wenn Sie dies wünschen oder tun müssen. Dann können Sie Variablen des Datentyps oder Arrays davon erstellen oder den Typ (anstelle eines Zeigers auf den Typ) in andere Strukturen usw. einbetten. Sie verlieren etwas Kontrolle; Der Programmierer, der den Code schreibt, der die Struktur verwendet, kann die Details sehen und direkt auf die Strukturelemente zugreifen (lesen oder ändern). Vorsichtige Programmierer werden das nicht unnötig machen, aber es eröffnen sich Möglichkeiten, die durch die strenge ADT-Sprache ausgeschlossen werden - auf die Gefahr hin, dass Fehler gemacht werden.
- 1. C++ mehrere Definition mit konst Verknüpfung Fehler deklariert in .h
- 2. Wie kann man herausfinden, wo eine C-Struktur deklariert ist?
- 3. Gleichnamige Struktur mit unterschiedlicher Definition in C
- 4. C - deklariert int array innerhalb der Struktur
- 5. wie man eine Struktur vor der Definition in vb.net deklariert
- 6. Wo ist die Struktur vop_vector deklariert?
- 7. Wo ist die Definition von __warn_memset_zero_len in string3.h
- 8. #include in .h oder .c/.cpp?
- 9. Wie sollten Klassenfelder in C++ deklariert werden?
- 10. Sollte `Phone` eine Klasse oder eine Struktur in C# sein?
- 11. Sollte ich eine POD-Struktur in einer .h-Datei oder in einer .cpp-Datei platzieren?
- 12. C und Bison: Zeiger auf die Struktur in% Union Definition
- 13. C++ anonyme struct ungewöhnliche Definition
- 14. C/C++: Daten in einer Struktur packen oder auffüllen
- 15. Extrahiere die Felder einer C-Struktur
- 16. Größe einer Struktur in C
- 17. C++ deklariert mehrere Klassen in einer Kopfzeile
- 18. Wo eine verschachtelte Union in einer Struktur in C platzieren?
- 19. globale Definition einer Variablen in C
- 20. Soll ich die Deklaration oder die Definition in C++ kommentieren?
- 21. Wo sollen Protokolle in swift deklariert werden?
- 22. Kann eine C-Struktur mehrfach definiert werden?
- 23. Erben einer gepackten C-Struktur
- 24. Was macht die Neubildung einer leeren Struktur in C#?
- 25. libgit2 GIT_BUF_INIT nicht deklariert; Wo sollte es erklärt werden?
- 26. Ziel C-Klasse oder Struktur?
- 27. C++ Struktur oder Array Sortierung
- 28. Funktion zum Freigeben einer Struktur in C
- 29. In der C-Sprache, Struktur, feinen Unterschied in der Definition
- 30. Kann CATextLayer in einer c-Struktur verwendet werden?
Was ist Ihre Frage genau? Wenn die Struct-Definition aus mehreren .c-Dateien benötigt wird, sollte sie in den Header gehen, sonst muss sie nicht. –
@ M.M Es wird nur in einer .c-Datei benötigt. Meine Frage ist, ob es eine Option gibt, die als gute Praxis angesehen wird und nicht die andere, und wenn das der Fall ist. – Nevado
Das ist wirklich eine Frage der Meinung.Im Allgemeinen ist es eine gute Übung, nichts in einen Header zu schreiben, wenn es nicht an anderer Stelle benötigt wird. –