Wann sollte ich defdef struct vs. pointer to struct eingeben?

8

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?

    
Phonon 15.02.2012, 15:47
quelle

3 Antworten

6

Sie können eine Struktur auch ohne typedef weiterleiten - die einzigen Unterschiede sind:

  • ob die Oberfläche sauberer aussieht mit oder ohne das Schlüsselwort struct
  • ob die Schnittstelle mit oder ohne expliziten Zeiger sauberer aussieht *

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.

    
Useless 15.02.2012, 15:58
quelle
1

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 .

    
dasblinkenlight 15.02.2012 15:56
quelle
1

Lesen Sie den Linus Torvalds-Beitrag Kapitel 5: Typedefs

    
Bill Wang 22.05.2013 08:16
quelle