позднее связывание в C

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

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

5
задан Vijay 18 June 2010 в 14:32
поделиться

2 ответа

Позднее (оно же динамическое) связывание не имеет ничего общего с динамически загружаемыми модулями (именно об этом говорят 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;
}
15
ответ дан 18 December 2019 в 10:42
поделиться

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

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

1
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: