2010-06-18 14 views
5

Jak można osiągnąć późniejsze wiązanie w języku c? może ktoś proszę podać przykład.późne wiązanie w C

Myślę, że można to osiągnąć za pomocą dlopen i dlsym, ale nie jestem do końca pewien. Proszę mnie poprawić, jeśli się mylę!

Odpowiedz

14

Późne (AKA Dynamic) Wiązanie nie ma nic wspólnego z dynamicznie ładowanymi modułami (co to jest dlopen i dlsym) per se. Zamiast tego chodzi o opóźnienie decyzji o tym, która funkcja jest wywoływana do czasu wykonania.

W języku C jest to wykonywane przy użyciu wskaźników funkcji (co również oznacza, że ​​praktycznie każda implementacja C++ wykonuje to w przypadku funkcji wirtualnych).

Jednym ze sposobów naśladowania tego jest przekazanie struktur wskaźników funkcji wokół, a następnie tylko wywoływanie funkcji za pomocą wskazanych wskaźników funkcji.

Przykład:

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: Podstawowym późno mechanizm wiązania mogą być realizowane jako swoją powiedział, ale można użyć kombinacji dlopen/dlclose/dlsym i wskazówki do działania, aby coś podobnego :

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

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

Myślę, że to jest to, czego szuka Benjamin Button.

+0

Myślę, że Frerich dobrze sobie radził, wyjaśniając, co oznacza pojęcie późno/dynamicznego wiązania * faktycznie *. –

+0

Tak, zrobił bardzo dobrze. Właśnie wspomniałem o przypadku użycia. –

+0

Łączenie z biblioteką dzieloną to także sposób abstrakcji. W ten sposób implementacja/zachowanie wspólnej biblioteki może się różnić aż do samego czasu wykonania aplikacji. – shuva