2017-12-03 3 views
0

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?

+2

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. –

+0

@ 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

+0

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. –

Antwort

2

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.

Verwandte Themen