PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Plugin System: struct Kompatibilität



Trillian
23-10-2003, 13:24
Huhu,
in meinem aktuellen Projekt benutze ich 2 Typen von Plugins. Beide sind ähnlich aufgebaut, werden fast auf gleiche Weise initialisiert/runtergefahren. Aus diesem Grund möchte ich den Code fürs initialisieren/shutdown nicht doppelt im Binary haben, sondern eine Funktion für beide Plugins nutzen.

Der Header der Plugins sieht so aus:



typedef struct {
void *handle;
void (*shutdown)();

....
} Foo;


Wird folgendes auf jeder Plattform mit einem Standard C Compiler funktionieren?



PluginA *a = plugin_a_new();
PluginB *b = a;

b->shutdown();


d.h. kann ich mich drauf verlassen, dass bei beiden Strukturen der Shutdown-Pointer an der gleichen Adresse liegt? Zumindest mit gcc3 unter x86 funktionierts, aber es sollte auch unter anderen UNIX Systemen laufen.

Falls es so nicht klappt, gibts einen Workaround?

Danke.

anda_skoa
23-10-2003, 17:08
Original geschrieben von Trillian
d.h. kann ich mich drauf verlassen, dass bei beiden Strukturen der Shutdown-Pointer an der gleichen Adresse liegt? Zumindest mit gcc3 unter x86 funktionierts, aber es sollte auch unter anderen UNIX Systemen laufen.


Ich denke schon, so lange die Plugins auf der selben Plattform kompiliert wurden und vor den beiden Pointern keine Datenelemente liegen.

Ciao,
_

Trillian
23-10-2003, 18:09
Wieso Datenelemente? Ein Pointer ist doch auch eins? Oder werden Funktions-Zeiger in Strukturen anders behandelt als andere Variablen?

anda_skoa
23-10-2003, 19:08
Original geschrieben von Trillian
Wieso Datenelemente? Ein Pointer ist doch auch eins?
Ja, die Betonung liegt auf vor. :)
Werd das mal editieren

Ciao,
_

Trillian
23-10-2003, 22:22
Ich versteh's immernoch nicht - meinst du, dass der Zugriff nur dann sauber funktioniert, wenn auf das erste Member der Struct zugegriffen wird? Wäre doof, weil ich definiertes Verhalten bei den ersten beiden Pointern brauche ;)

Wie auch immer, ich werd's erstmal so ausprobieren, wenn was nicht funktioniert, wird sich schon jemand melden ;)

Danke dir.

anda_skoa
24-10-2003, 09:48
Original geschrieben von Trillian
Ich versteh's immernoch nicht - meinst du, dass der Zugriff nur dann sauber funktioniert, wenn auf das erste Member der Struct zugegriffen wird? Wäre doof, weil ich definiertes Verhalten bei den ersten beiden Pointern brauche ;)


Nein, ich meine, dass es nur geht, wenn die Reihenfolge gleich ist.
Wenn PluginA so aussieht


typedef struct {
void* handle;
void (*shutdown) ();
} PluginA;

und PluginB so


typedef struct {
int data;
void* handle;
void (*shutdown) ();
} PluginB;

gehts nicht, weil in B vor den beiden Pointer ein weiteres Datenelement ist

Ciao,
_

Trillian
24-10-2003, 12:41
Original geschrieben von anda_skoa
Nein, ich meine, dass es nur geht, wenn die Reihenfolge gleich ist.
Wenn PluginA so aussieht
[snip]
gehts nicht, weil in B vor den beiden Pointer ein weiteres Datenelement ist


Ach so, das ist klar :D