Anzeige:
Ergebnis 1 bis 7 von 7

Thema: [C] Plugin System: struct Kompatibilität

  1. #1
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180

    [C] Plugin System: struct Kompatibilität

    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:

    Code:
    typedef struct {
        void *handle;
        void (*shutdown)();
    
        ....
    } Foo;
    Wird folgendes auf jeder Plattform mit einem Standard C Compiler funktionieren?

    Code:
    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.

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: [C] Plugin System: struct Kompatibilität

    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Wieso Datenelemente? Ein Pointer ist doch auch eins? Oder werden Funktions-Zeiger in Strukturen anders behandelt als andere Variablen?

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von Trillian
    Wieso Datenelemente? Ein Pointer ist doch auch eins?
    Ja, die Betonung liegt auf vor.
    Werd das mal editieren

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    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.

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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
    Code:
    typedef struct  {
        void* handle;
        void (*shutdown) ();
    } PluginA;
    und PluginB so
    Code:
    typedef struct  {
        int data;
        void* handle;
        void (*shutdown) ();
    } PluginB;
    gehts nicht, weil in B vor den beiden Pointer ein weiteres Datenelement ist

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •