Как передать / сделать объект / переменную доступной внутри функции обратного вызова, которая вызывается сторонней библиотекой?

#c #callback #global-variables #global-object

#c #обратный вызов #глобальные переменные #глобальный объект

Вопрос:

Как сделать globalObject доступным с помощью callbackFunction ?

Я использую стороннюю библиотеку library.h , в которой есть метод libraryFunction . Вывод libraryFunction — это a libraryFunctionOutput , который передается в функцию обратного callbackFunction вызова .

Как передать другой объект (например globalObject ) для использования внутри функции обратного callbackFunction вызова?

К сожалению, сторонняя библиотека скомпилирована, поэтому я не могу вносить в нее какие-либо изменения.

 #include <stdio.h>
#include "library.h"

int callbackFunction(int libraryFunctionOutput):
    printf("%s, %d", libraryFunctionOutput, globalObject);
    return 1;

int main(int argc, char* argv[])
{
   int globalObject = 0;
   libraryFunction(callbackFunction);
}
  

В документации функция показана как:

 int __stdcall libraryFunction(const char*    filename,
                              unsigned int   flags,
                              int            userID,
                              MathrelCallback callbackFunction);
  

MathrelCallback Структура определяется следующим образом:

 struct MathrelCallback {MathrelHeader header;
                        MathrelInfo   data;
                        unsigned int Type;
};
  

Комментарии:

1. Что такое подпись libraryFunction ? Если он принимает лямбда-выражение, ответ будет тривиальным. Не знаю, возможно ли это, если он принимает только указатели на функции, за исключением копирования globalObject в глобальную переменную.

2. Большинство API-интерфейсов в стиле C также передают указатель контекста. Вы должны использовать это для контекста.

3. @Franck Я добавил, как библиотека выглядит в документации. Я не думаю, что он принимает лямбда. Я доволен globalObject в глобальной переменной, поскольку это относительно небольшое приложение. @krzaq К сожалению, никакие другие контекстные аргументы не могут быть переданы внутри libraryFunction , кроме того, какую функцию обратного вызова использовать.

4. Можете ли вы опубликовать определение MathrelCallback ? Я думаю, это просто простой указатель на функцию, но кто знает…

5. @Horstling обновил сообщение, чтобы добавить MathrelCallback определение.

Ответ №1:

Если библиотека действительно принимает указатель на функцию (а не обобщенный вызываемый объект, такой как std::function) и не предоставляет возможности передавать контекстный или пользовательский указатель на ваш обратный вызов, вы должны сделать свой глобальный объект глобальным (со всеми его недостатками):

 #include <stdio.h>
#include "library.h"

static int globalObject = 0;

int callbackFunction(int libraryFunctionOutput)
{
    printf("%s, %d", libraryFunctionOutput, globalObject);
    return 1;
}

int main(int argc, char* argv[])
{
   libraryFunction(callbackFunction);
}
  

Комментарии:

1. Будет ли это компилироваться? Я пытаюсь привести небольшой пример в действие, и я, должно быть, что-то упускаю. : Выглядит неуместно?

2. Попробуйте изменить int main(int argcm char* argv[]) на int main(int argc, char* argv[]) .

3. О, sry, просто скопировал и отредактировал исходный код, даже не заметил ошибок.