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?
Antwort
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.
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
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
SiegeX: Ich änderte den Beitrag, um die Verwirrung über die Implementierung zu vermeiden – Phong
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.
Quibble: Dieses Idiom ist * nur * über die Kapselung. Kapselung ist notwendig für die Objektorientierung, aber es ist das kleinste Stück davon. – dmckee
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. –
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
Ein undurchsichtiger Typ ist ein Typ, der in APIs über einen Zeiger verfügbar gemacht wird, aber niemals konkret definiert ist.
- 1. Wann sind Schwartzsche Transformationen nützlich?
- 2. Was sind Allokatoren und wann ist ihre Verwendung notwendig?
- 3. Wann sind Tunnel- und Bubbling-Ereignisse in WPF nützlich?
- 4. Sind in C++ 1y public typedefs in der Klasse notwendig?
- 5. Wann wird das @ nützlich?
- 6. Wann ist Backtracking notwendig?
- 7. Warum sind Cygwin und MinGW notwendig?
- 8. Wie sind Funktoren nützlich?
- 9. Wann ist in C++ in Windows "extern C" notwendig?
- 10. Wann ist File.join nützlich?
- 11. Sind Schnittstellen in JavaScript notwendig?
- 12. Wann Zeiger in C++ zu verwenden sind
- 13. Warum sind Vorwärtsdeklarationen notwendig?
- 14. Signatur- und Exchange-Schlüsseltypen - was sind sie und wann sie zu verwenden sind (Makecert -sky)?
- 15. Warum sind unbenannte Parameter nützlich?
- 16. Sind "Getter" und "Setter" in JavaScript notwendig?
- 17. Sind Währungsformatierungsfunktionen tatsächlich nützlich?
- 18. Wann ist ein ConcurrentSkipListSet nützlich?
- 19. Was sind Ansichten für Sammlungen und wann möchten Sie sie verwenden?
- 20. Java Generics Typ Casting notwendig?
- 21. Wann sind C# "using" -Anweisungen am nützlichsten?
- 22. Wann ist Zeiger auf Array nützlich?
- 23. Wann ist die Reintegrationsoption wirklich notwendig?
- 24. Sind in der C/C++ Programmierung globale Destruktoren notwendig?
- 25. Wann ist das Objekt() eingebaut nützlich?
- 26. Was ist INSTALL_DIR nützlich in ExternalProject_Add Befehl?
- 27. Wann ist der Unterschied zwischen quotRem und divMod nützlich?
- 28. Was macht 'adb remount'? Wann ist es nützlich?
- 29. Was ist der Zweck von "::" und warum ist es nützlich?
- 30. C# USING Schlüsselwort - wann und wann nicht?
'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. –