Frage Cross-Platfrom design?
-
@SoIntMan sagte in Frage Cross-Platfrom design?:
so irgendwie:
typedef struct X X; typedef MyInt32 <placeholder>
Module.c
struct X {...} <placeholder> os_32int
Das funktioniert in C nicht. Du kannst nur Zeiger auf den struct X definieren, und damit wird die eigentliche Implementation nicht verborgen. In anderen Programmiersprachen geht das.
Mit dem Pimpl-Idiom hast Du ein äußeren struct und Funktionen, der die API definiert und intern nutzt dieser struct einen Zeiger auf die eigentliche Datenstruktur. Dadurch wird in C die Linkabhängigkeit durchbrochen. Sprich man kann die Implementation z.B. in einer Library ändern, ohne dass man die Programme neu übersetzen muss. Es muss nur die Library neu gebaut werden.
// API.h struct X { void* impl_; } void X_init(struct X *self); int X_foo(struct X *self); // API.c #include "X_impl.h" void X_init (struct X *self) { impl_ = malloc(sizeof(struct X_impl)); } int X_foo(struct X *self) { struct X_impl *p = (struct X_impl*)impl_; return X_impl_foo(p); }
-
Mache dir bitte etwas bewusst, du bist hier im Bereich der Schnittstellen-Definition. Also etwas, wo es manchmal heißt: Einmal Schnittstelle definieren, niemals mehr verändern, nur noch anfügen.
Und generell dienen dir alle Definitionen der Schnittstelle nur als Abstraktionsebene zu der Implementierung.
Dein
MyInt32
ist also erstmal nicht ein 32 Bit Integer von Betriebssystem XYZ, sondern ein 32 Bit Integer auf allen Betriebssystemen.MyInt32
ist also unabhängig von irgentwelchen Betriebssystemen.BTW: Das Beispiel ist nicht gut, da wir hier von einem primitiven Datentyp bzw.
int32_t
reden.
-
@Quiche-Lorraine sagte in Frage Cross-Platfrom design?:
BTW: Das Beispiel ist nicht gut, da wir hier von einem primitiven Datentyp bzw. int32_t reden.
ja das habe ich auch erkannt , war bissel zu arg im over-engineering...:)
ich werde jetzt die Standard typen c11 also in dem int32_t verwenden;)