2010-06-18 13 views
5

Wie kann späte Bindung in c-Sprache erreicht werden? kann jemand bitte ein Beispiel geben.späte Bindung in C

ich denke, dass es mit dlopen und dlsym erreicht werden kann, aber ich bin mir nicht sicher. Bitte korrigieren Sie mich, wenn ich falsch liege!

Antwort

14

Späte (AKA Dynamische) Bindung hat nichts mit dynamisch geladenen Modulen zu tun (worüber sich dlopen und dlsym überhaupt sprechen). Stattdessen wird die Entscheidung, welche Funktion aufgerufen wird, bis zur Laufzeit verzögert.

In C wird dies mit Funktionszeigern gemacht (was auch praktisch jede C++ - Implementierung für virtuelle Funktionen tut).

Eine Möglichkeit, dies zu emulieren, besteht darin, Strukturen von Funktionszeigern herumzugeben und dann nur Funktionen über die gegebenen Funktionszeiger aufzurufen.

Ein Beispiel:

typedef struct Animal { 
    void (*sayHello)(struct Animal *a, const char *name); 
} Animal; 

static void sayQuakQuak(Animal *a, const char *name) { 
    printf("Quak quak %s, says the duck at 0x%x!\n", name, a); 
} 

/* This function uses late binding via function pointer. */ 
void showGreeting(Animal *a, const char *name) { 
    a->sayHello(a, name); 
} 


int main() { 
    struct Animal duck = { 
     &sayQuakQuak 
    }; 
    showGreeting(&duck, "John"); 
    return 0; 
} 
1

@Frerich Raabe: Der Grund späte Bindung Mechanismus kann als die implementiert werden, aber Sie können eine Kombination aus dlopen/dlclose/dlsym und Zeiger verwenden, um funktionieren so etwas wie zu bekommen :

void *libraryHandle; 
void (*fp)(void); 

if (something) 
     libraryHandle = dlopen("libmylibrary0.1"); 
else 
    libraryHandle = dlopen("libmylibrary0.2"); 
fp = dlsym(libraryHandle, "my_function"); 
fp(); 

Ich denke, das ist, was Benjamin Button sucht.

+0

Ich denke, dass Frerich gut gemacht hat, indem er erklärt hat, was das Konzept der späten/dynamischen Bindung * eigentlich * bedeutet. –

+0

Ja, er hat es sehr gut gemacht. Ich habe gerade einen Anwendungsfall erwähnt. –

+0

Gemeinsame Bibliothek Verknüpfung ist auch eine Art der Abstraktion. Auf diese Weise kann die Implementierung/das Verhalten der gemeinsam genutzten Bibliothek bis zur Ausführungszeit der Anwendung variieren. – shuva