C中的迟结合

juzqafwq  于 2023-11-16  发布在  其他
关注(0)|答案(3)|浏览(136)

如何在C语言中实现后期绑定?谁能提供一个例子?
我想可以用dlopendlsym来实现,但我不确定,如果我错了,请纠正我!

ujv3wf0j

ujv3wf0j1#

后期绑定(也称为动态绑定)与动态加载的模块(这就是dlopendlsym的含义)本身没有任何关系。相反,它是关于将调用哪个函数的决定延迟到运行时。
在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;
}

字符串

ocebsuys

ocebsuys2#

@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();

字符串
我想这就是本杰明·巴顿要找的东西

r7knjye2

r7knjye23#

正如Frerich Raabe提到的,这一切都是关于延迟调用什么函数的决定,就是这样。
为了强调它是C/C++中的一种通用机制,我喜欢考虑下面的纯C(和C风格的编码,即不存在任何“OO概念”),以掌握早期/晚期绑定的概念:

#include <stdio.h>

int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

int mul(int a, int b)
{
    return a * b;
}

int divide(int a, int b)
{
    return a / b;
}

int main(int argc, char** argv)
{
    int input;
    printf("main - please enter your choice of operation:1 - add, 2 - substruct, 3 - mulitply, 4 - division\n");
    scanf("%d", &input);
    int (*funcPointer)(int, int); 
    int a = 6, b = 2;
    switch(input)
    {
        case 1: funcPointer = &add;
                break;
        case 2: funcPointer = &sub;
                break;
        case 3: funcPointer = &mul;
                break;
        case 4: funcPointer = &divide;
                break;
    }

    printf("main - running the desired function\n");

    // this is where LATE binding takes place
    int res = (*funcPointer)(a, b);
    printf("main - result of the desired function is:%d\n", res);

    // this is where EARLY binding takes place
    res = divide(a, b);
    printf("main - result of the divide function is:%d\n", res);
    return 0;
}

字符串

相关问题