2010-02-20 5 views
28

Ich habe das Konzept der "undurchsichtigen Typen" ein wenig herumgeworfen, aber ich habe wirklich keine lapidare Antwort gefunden, was einen undurchsichtigen Typ in C definiert und was noch wichtiger ist, welche Probleme wir mit ihrer Existenz lösen können. DankeWas definiert einen undurchsichtigen Typ in C und wann sind sie notwendig und/oder nützlich?

+13

'FILE' ist ein gutes Beispiel für einen undurchsichtigen Typ im C-Standard. Alles, was Sie jemals brauchen, ist ein 'FILE *' - Objekt, und Sie verwenden Standard-C-Funktionen, die darauf angewendet werden. Ihnen als Programmierer ist es egal, woraus der Typ 'FILE' besteht. –

Antwort

28

Es ist das am häufigsten für Bibliothekszwecke verwendete. Das Hauptprinzip hinter dem Opaque-Typ in c besteht darin, Daten über den Zeiger zu verwenden, um die Implementierung der Datenverarbeitung zu verbergen. Da die Implementierung ausgeblendet ist, können Sie die Bibliothek ändern, ohne ein Programm neu zu kompilieren, die davon abhängen (wenn die Schnittstelle eingehalten 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 gesagt, ist es nicht nötig, jedes einzelne Programm neu zu kompilieren, das darauf angewiesen ist.

+0

Ich gehe davon aus, dass die '// Implementierung' Teile nicht von der gleichen '// Header-Datei' getrennt sind und was in den Bibliotheken gehen? Es sieht auch so aus, als hätten Sie 'struct s' im Header deklariert, aber bis zur Implementierung nie definiert. Ich habe kürzlich einen tollen Beitrag über 'extern'-Variablen in C gelesen. Http://stackoverflow.com/questions/1433204/what-are-extern-variables-in-c Die Konzepte scheinen auffallend ähnlich zu sein, sollte nicht 'struct s' erklärt werden als 'extern struct s' in deinem Beispielcode? – SiegeX

+2

Verwendung von extern für Variable wird im Allgemeinen verwendet, um globale Variable zu deklarieren (die absolut nicht auf unseren Fall bezogen ist). Hier die Anweisungsstruktur s; ist hier, um dem Kompilator einen Typ namens struct s anzugeben. Da alle API in der Header-Datei NUR Zeiger auf diese Struktur verwenden. Es muss nicht die Strukturgröße kennen, sondern die Größe des Pointers der Struktur (der vom Compiler definiert wird). Um es zu vereinfachen, erlaubt es dem Programm, ein Objekt zu verwenden, indem es seine Adresse verwendet (den Zeiger auf die Struktur) – Phong

+0

SiegeX: Ich änderte den Beitrag, um die Verwirrung über die Implementierung zu vermeiden – Phong

12

In meinem Verständnis sind undurchsichtige Typen die, die Ihnen erlauben, ein Handle (dh einen Zeiger) zu einer Struktur zu halten, aber seinen Inhalt nicht direkt ändern oder anzeigen (wenn Sie überhaupt dürfen, tun Sie dies) durch Hilfsfunktionen, die die interne Struktur verstehen).

Opaque-Typen sind zum Teil eine Möglichkeit, C objektorientierter zu machen. Sie ermöglichen die Kapselung, so dass die internen Details eines Typs sich ändern oder in verschiedenen Plattformen/Situationen unterschiedlich implementiert werden können, ohne dass der Code, der sie verwendet, sich ändern muss.

+2

Quibble: Dieses Idiom ist * nur * über die Kapselung. Kapselung ist notwendig für die Objektorientierung, aber es ist das kleinste Stück davon. – dmckee

+1

Wahr, es braucht viel mehr als das für fast objektorientierte Objekte. Dennoch ist es der eine Teil des objektorientierten Designs, den ich immer vermisse, wenn ich in C schreibe. Außerdem, wenn Sie versuchen sollten, Vererbung und Polymorphismus in C nachzuahmen (mehr Arbeit, als es wert ist)), würden Sie fast sicher mit undurchsichtigen Typen beginnen müssen. –

+4

Denken Sie daran, dass c und die von ihm erzeugte Kultur aus einer Zeit stammen, in der die Objektorientierung eine seltene und immer noch eher experimentelle Sache war. Prozedurale und funktionale Programmierer der konzentrierten Zeit der Verkapselung als * das * Mittel zur Kontrolle von Interkonnektivität und unnötiger Komplexität. Über undurchsichtige Typen in c als eine Art verkrüppeltes Objekt zu sprechen, drückt ein fremdes POV auf die Sprache. - dmckee vor 10 Minuten – dmckee

8

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

Verwandte Themen