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ę!
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ę!
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;
}
@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.
Myślę, że Frerich dobrze sobie radził, wyjaśniając, co oznacza pojęcie późno/dynamicznego wiązania * faktycznie *. –
Tak, zrobił bardzo dobrze. Właśnie wspomniałem o przypadku użycia. –
Łą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