Ich bin kein Experte für untergeordnete nicht-objektorientierte Programmiersprachen und schreibe gerade C-Code für ein Projekt bei der Arbeit. Ich versuche, einige anständige abstrakte Datentypen zu schaffen, mit denen ich arbeiten kann, und das Googeln hat mir gezeigt, dass Leute struct-basierte ADTs auf zwei Arten verwenden. Einige Leute definieren einen Datentyp als Struktur:
%Vor%und stellen Sie es der Welt in der Header-Datei zur Verfügung.
Andere definieren einen Datentyp als -Zeiger für struct:
%Vor%Ich verstehe, dass dieser Ansatz Ihnen erlaubt, eine Struktur zu schreiben, ohne der Außenwelt irgendwelche Kenntnisse darüber zu geben, was sich in dieser Struktur befindet. Daher können Programmierer nur Funktionen verwenden, die in derselben Header-Datei enthalten sind Datentyp.
Gibt es noch einen anderen Grund, sich für den anderen zu entscheiden? Gibt es eine allgemeine Faustregel für die Definition von ADTs als Strukturen und wann definieren wir sie als Zeiger auf Strukturen?
Sie können eine Struktur auch ohne typedef weiterleiten - die einzigen Unterschiede sind:
struct
*
ZB
%Vor%Offensichtlich gilt dies nur für vorwärts deklarierte Strukturen in einem Interface-Header.
Wenn Sie die Strukturimplementierung nicht ausblenden, ist die Auswahl zwischen S1
und S2
eine Frage der Präferenz (oder der Konsistenz). Ich würde S3
nicht verwenden, außer es ist ein wirklich undurchsichtiger / versteckter Typ.
Persönliche Präferenz wäre die Verwendung von S1
(explizites Schlüsselwort struct) für große / komplexe Aggregate und S2
für kleine Strukturen, die Sie wie Werte behandeln und nicht immer als Zeiger übergeben werden. YMMV.
Die Entscheidung, sich zu verstecken oder nicht zu verstecken, liegt ganz bei Ihnen als Designer Ihrer Bibliothek. Wenn Sie sich das Recht vorbehalten möchten, Ihre struct
in Zukunft beliebig zu ändern, sollten Sie keines ihrer Mitglieder der "Welt" aussetzen. Wenn Sie ein struct
als Mittel zur Kommunikation mit Ihrer Bibliothek bereitstellen (zum Beispiel ein struct
, das einen Punkt in 3D darstellt), können Sie seine Mitglieder nicht vor der Welt verbergen, da dies den Zweck vereiteln würde .
Tags und Links c struct typedef abstract-data-type