Was definiert einen undurchsichtigen Typ in C, und wann sind sie notwendig und/oder nützlich?

Lesezeit: 5 Minuten

Benutzeravatar von SiegeX
BelagerungX

Ich habe das Konzept der „undurchsichtigen Typen“ ein wenig herumgeworfen gesehen, aber ich habe wirklich keine prägnante Antwort darauf gefunden, was einen undurchsichtigen Typ in C definiert und was noch wichtiger ist, welche Probleme wir mit ihrer Existenz lösen können. Vielen Dank

  • FILE ist ein gutes Beispiel für einen undurchsichtigen Typ im C-Standard. Alles, was Sie jemals brauchen, ist ein FILE * Objekt, und verwenden Sie Standard-C-Funktionen, die darauf arbeiten. Ihnen als Programmierer ist es egal, was die FILE Art besteht aus.

    – Alok Singhal

    20. Februar 2010 um 7:36 Uhr

  • pthread_t ist ein undurchsichtiger Typ

    – Krishna Kanth Yenumula

    23. Mai 2020 um 0:48 Uhr

Benutzeravatar von Phong
Phong

Es wird am häufigsten für Bibliothekszwecke verwendet. Das Hauptprinzip hinter Opaque Type in c besteht darin, Daten durch ihren Zeiger zu verwenden, um die Implementierung der Datenverarbeitung zu verbergen. Da die Implementierung versteckt ist, können Sie die Bibliothek ändern, ohne ein Programm neu zu kompilieren, das davon abhängt (wenn die Schnittstelle respektiert wird).

zB: Version 1:

// header file
struct s;

int s_init(struct s **x);
int s_f(struct s *x);
int s_g(struct s *x);

// source file
struct s { int x; }

int s_init(struct s **x) { *x = malloc(...); }
int s_f(..) { ... }
int s_g(..) { ... }

Version 2

// header file
struct s;

int s_init(struct s **x);
int s_f(struct s *x);
int s_g(struct s *x);

// source file
struct s { int y; int x; }

int s_init(struct s **x) { *x = malloc(...); }
int s_f(..) { ... }
int s_g(..) { ... }

Von Ihrer Programmseite hat sich nichts geändert! und wie bereits erwähnt, muss nicht jedes einzelne Programm, das darauf angewiesen ist, neu kompiliert werden.

  • Ich gehe davon aus, dass die Teile „//Implementierung“ nicht von derselben „//Header-Datei“ getrennt sind und was in die Bibliotheken gehört? Außerdem scheint es, als hättest du es erklärt struct s im Header, aber bis zur Implementierung nie definiert. Neulich habe ich einen tollen Beitrag gelesen extern Variablen in C stackoverflow.com/questions/1433204/… Die Konzepte scheinen auffallend ähnlich zu sein, sollten es nicht struct s deklariert werden als extern struct s in Ihrem Beispielcode?

    – SiegeX

    21. Februar 2010 um 0:14 Uhr


  • Die Verwendung von extern für Variablen wird im Allgemeinen verwendet, um globale Variablen zu deklarieren (was absolut nichts mit unserem Fall zu tun hat). Hier die Anweisung struct s; ist hier, um dem Compilator anzuzeigen, dass ein Typ namens struct s existiert. Da alle APIs in der Header-Datei NUR Zeiger auf diese Struktur verwenden. Es muss nicht die Strukturgröße kennen, sondern die Größe des Strukturzeigers (die vom Compiler definiert wird). Zur Vereinfachung erlaubt es dem Programm, ein Objekt zu verwenden, indem es seine Adresse (den Zeiger auf die Struktur) verwendet.

    – Phon

    21. Februar 2010 um 5:12 Uhr


  • siegeX: Ich habe den Beitrag geändert, um die Verwirrung über die Implementierung zu vermeiden

    – Phon

    23. Oktober 2013 um 6:23 Uhr


  • @SiegeX In C gibt es keinen Fall, in dem Sie eine nicht konstante Variable als deklarieren müssen extern. Abgesehen von dem Fall, in dem Sie globale Konstanten haben, ist das Schlüsselwort extern nur gut für die Spaghetti-Programmierung. Wenn Sie jemals Variablen als extern/global deklarieren, ist dies ein sicheres Zeichen dafür, dass Ihr Programmdesign sehr schlecht ist.

    – Ludin

    7. Mai 2015 um 11:48 Uhr

Nach meinem Verständnis sind undurchsichtige Typen solche, die es Ihnen ermöglichen, ein Handle (dh einen Zeiger) auf eine Struktur zu halten, aber ihren Inhalt nicht direkt zu ändern oder anzuzeigen (wenn Sie das überhaupt dürfen, tun Sie dies über Hilfsfunktionen, die verstehen die innere Struktur).

Undurchsichtige Typen sind teilweise eine Möglichkeit, C objektorientierter zu machen. Sie ermöglichen die Kapselung, sodass sich die internen Details eines Typs ändern – oder in verschiedenen Plattformen/Situationen unterschiedlich implementiert werden können – ohne dass der Code, der ihn verwendet, geändert werden muss.

  • Quibble: diese Redewendung ist nur über Kapselung. Die Kapselung ist für die Objektorientierung notwendig, aber sie ist der kleinste Teil davon.

    – dmckee — Ex-Moderator-Kätzchen

    20. Februar 2010 um 18:08 Uhr

  • Es stimmt, für alles, was annähernd objektorientiert ist, braucht es viel mehr als das. Dennoch ist es der eine Teil des objektorientierten Designs, der ich bin stets fehlt, wenn ich in C. Plus schreibe, wenn Sie war Um zu versuchen, Vererbung und Polymorphismus in C zu emulieren (mehr Arbeit, als es wert ist), müssten Sie mit ziemlicher Sicherheit mit undurchsichtigen Typen beginnen.

    – Tim Yates

    20. Februar 2010 um 18:16 Uhr

  • Denken Sie daran, dass c und die Kultur, die es hervorgebracht hat, aus einer Zeit stammen, als Objektorientierung eine seltene und immer noch ziemlich experimentelle Sache war. Prozedurale und funktionale Programmierer der Zeit konzentrierten sich auf Kapselung als das Mittel zur Kontrolle der Interkonnektivität und unnötiger Komplexität. Über undurchsichtige Typen in c als eine Art verkrüppeltes Objekt zu sprechen, schiebt einen fremden POV auf die Sprache. – dmckee vor 10 Minuten

    – dmckee — Ex-Moderator-Kätzchen

    20. Februar 2010 um 18:50 Uhr

  • @dmckee Es dient nicht nur der Kapselung. Sie können undurchsichtige Typen auch verwenden, um Vererbung/Polymorphismus zu implementieren, auch wenn dies vielleicht nicht die ursprüngliche Absicht von unvollständigen Typen war. Wie auch immer, vor allem ist die Objektorientierung ein Programm Entwurfsmethodees ist nicht eine Sprachfunktion. Unabhängig von der Sprache sollten Sie immer ein objektorientiertes Programmdesign verwenden! Und nachdem das Design fertig ist, können Sie sich ansehen, welche Sprachfunktionen verfügbar sind, und prüfen, wie Sie Ihr Design am besten in der jeweiligen Sprache implementieren.

    – Ludin

    7. Mai 2015 um 11:44 Uhr

Ein undurchsichtiger Typ ist ein Typ, der in APIs über einen Zeiger verfügbar gemacht, aber nie konkret definiert wird.

1415700cookie-checkWas definiert einen undurchsichtigen Typ in C, und wann sind sie notwendig und/oder nützlich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy