2010-06-18 12 views
5

¿Cómo se puede lograr la unión tardía en c lenguaje? ¿Alguien puede dar un ejemplo?encuadernación tardía en C

Creo que se puede lograr utilizando dlopen y dlsym, pero no estoy seguro. ¡Por favor corrígeme si estoy equivocado!

Respuesta

14

Late (AKA Dynamic) La vinculación no tiene nada que ver con los módulos cargados dinámicamente (que es de lo que se tratan dlopen y dlsym) per se. En cambio, se trata de retrasar la decisión sobre qué función se llama hasta el tiempo de ejecución.

En C, esto se hace usando punteros a función (que es también la práctica aplicación de C++ para funciones virtuales).

Una forma de emular esto es pasar las estructuras de los punteros a las funciones y luego solo llamar a las funciones a través de los punteros de función dados.

Un ejemplo:

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: El mecanismo de enlace en tiempo básica se puede implementar como su dicho, pero se puede utilizar una combinación de dlopen/dlclose/dlsym y punteros a funcionar para obtener algo así como :

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

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

Creo que esto es lo que Benjamin Button está buscando.

+0

Creo que Frerich hizo bien al explicar lo que significa el concepto de enlace tardío/dinámico * en realidad *. –

+0

Sí, lo hizo muy bien. Acabo de mencionar un caso de uso. –

+0

La vinculación de biblioteca compartida también es una forma de abstracción. De esta forma, la implementación/el comportamiento de la biblioteca compartida puede variar hasta el mismo tiempo de ejecución de la aplicación. – shuva