Попытка использовать extern в обратном порядке - PullRequest
3 голосов
/ 21 ноября 2011

Когда к нам прикреплены exe или dll и static library, мы можем использовать ключевое слово extern для доступа к статическим библиотекам variables и / или functions из exeили dll.Чтобы упростить ситуацию, давайте предположим, что к нему прикреплены exe и lib.

Я пытаюсь вызвать функцию exe из lib.

Исполняемый код

void doSomething() {
    // do something here
}

Статический связанный библиотечный код

void onSomeEvent() {
    doSomething(); // call doSomething() here
}

И наоборот, легко, но мне интересно, можно ли это сделать так, как ключевое слово extern.Или какой самый лучший метод?

Что мне приходит в голову, это передать function pointer (например, void*) одному из functions / methods в lib (возможно,конструктор класса).Я думаю, что это должно работать, но я не хочу слишком трогать код библиотеки, поскольку библиотека не моя и может быть заменена более новыми версиями.Я могу добавить / удалить несколько строк кода, но я хочу предотвратить изменение интерфейсов функций.

Что такое лучше способ?

Ответы [ 3 ]

4 голосов
/ 23 ноября 2011

Вы также можете объявить это вне вашей функции, вам могут понадобиться другие функции.

void doSomething(); // declares the function

void onSomeEvent() 
{
    doSomething(); // call doSomething() here
}

void onSomeEvent2() 
{
    doSomething(); // call doSomething() here
}
2 голосов
/ 21 ноября 2011

Конечно, вам просто нужно объявить функцию в библиотеке.

void onSomeEvent() {
    void doSomething(); // declares the function
    doSomething(); // call doSomething() here
}
1 голос
/ 21 ноября 2011

Учитывая, что статическая библиотека (вероятно) предназначена для использования во многих различных программах, весьма распространенным является использование подхода обратного вызова, когда exe инициализирует библиотеку и передает ей один или несколько указателей на функции, которые можно использовать для выполнения каких-либо задач (таких как ведение журнала).сообщения или что-то).Если исполняемый файл не передает указатели на функции (или передает их как NULL), то библиотека может просто не вызывать эти функции, и библиотека будет хорошо работать в обеих средах.

Это намного лучше, чем предполагать, что функции всегда определены в exe.

...