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;
}
Je pense que Frerich a bien fait en expliquant ce que signifie le concept de liaison tardive/dynamique * en réalité *. –
Oui, il a très bien fait. Je viens de mentionner un cas d'utilisation. –
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