2010-06-18 15 views
5

Comment une liaison tardive peut-elle être obtenue dans un langage c? quelqu'un peut-il s'il vous plaît fournir un exemple.liaison tardive dans C

je pense qu'il peut être réalisé en utilisant dlopen et dlsym mais je ne suis pas sûr à ce sujet.please corrigez-moi si je me trompe!

Répondre

14

La reliure tardive (AKA Dynamic) n'a rien à voir avec les modules chargés dynamiquement (ce qui concerne dlopen et dlsym) en soi. Au lieu de cela, il s'agit de retarder la décision concernant la fonction appelée jusqu'à l'exécution. En C, ceci est fait en utilisant des pointeurs de fonction (ce qui est également le cas de la quasi-totalité des implémentations C++ pour les fonctions virtuelles). Une manière d'émuler ceci est de faire circuler des structures de pointeurs de fonction, puis d'appeler seulement des fonctions via les pointeurs de fonction donnés.

Un exemple:

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: Le mécanisme de liaison tardive de base peut être mis en œuvre comme dit, mais vous pouvez utiliser une combinaison de dlopen/dlclose/dlsym et des pointeurs de fonction pour obtenir quelque chose comme :

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

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

Je pense que c'est ce que recherche Benjamin Button.

+0

Je pense que Frerich a bien fait en expliquant ce que signifie le concept de liaison tardive/dynamique * en réalité *. –

+0

Oui, il a très bien fait. Je viens de mentionner un cas d'utilisation. –

+0

La bibliothèque partagée est également un moyen d'abstraction. De cette manière, l'implémentation/le comportement de la bibliothèque partagée peut varier jusqu'au moment même de l'exécution de l'application. – shuva