позднее связывание в C - PullRequest
5 голосов
/ 18 июня 2010

Как можно добиться позднего связывания на языке c?Кто-нибудь может привести пример.

Я думаю, что это может быть достигнуто с помощью dlopen и dlsym, но я не уверен в этом. Пожалуйста, поправьте меня, если я ошибаюсь!

Ответы [ 2 ]

15 голосов
/ 18 июня 2010

Позднее (AKA Dynamic) Привязка не имеет ничего общего с динамически загружаемыми модулями (что и есть 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 голос
/ 18 июня 2010

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

Я думаю, это то, что ищет Бенджамин Баттон.

...