C 中的后期绑定

问题描述 投票:0回答:2

C语言如何实现后期绑定? 任何人都可以提供一个例子吗?

我认为可以使用

dlopen
dlsym
来实现,但我不确定。如果我错了,请纠正我!

c unix late-binding
2个回答
16
投票

后期(又称动态)绑定本身与动态加载的模块(这就是

dlopen
dlsym
的含义)没有任何关系。相反,它是将调用哪个函数的决定延迟到运行时。

在 C 中,这是使用函数指针完成的(这也是几乎任何 C++ 实现对虚函数的实现方式)。

模拟这一点的一种方法是传递函数指针结构,然后仅通过给定的函数指针调用函数。

一个例子:

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:基本的后期绑定机制可以按照您所说的方式实现,但是您可以使用 dlopen/dlclose/dlsym 和函数指针的组合来获得类似的内容:

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

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

我认为这就是本杰明·巴顿正在寻找的东西。

© www.soinside.com 2019 - 2024. All rights reserved.