5

c言語でレイトバインディングを実現するにはどうすればよいですか? 誰でも例を挙げてください。

dlopen と dlsym を使用して実現できると思いますが、よくわかりません。間違っている場合は修正してください。

4

2 に答える 2

15

Late (AKA Dynamic) Binding は、動的にロードされたモジュール (dlopen と dlsym の目的) 自体とは何の関係もありません。代わりに、実行時までどの関数が呼び出されるかの決定を遅らせます。

C では、これは関数ポインターを使用して行われます (これは、ほぼすべての C++ 実装が仮想関数に対して行う方法でもあります)。

これをエミュレートする 1 つの方法は、関数ポインターの構造体を渡し、指定された関数ポインターを介してのみ関数を呼び出すことです。

例:

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;
}
于 2010-06-18T14:40:34.483 に答える
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();

これがベンジャミン・バトンが求めているものだと思います。

于 2010-06-18T16:06:44.153 に答える