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

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

Я использую стороннюю библиотеку library.h у которого есть метод libraryFunction, Выход из libraryFunction это 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 ответ

Решение

Если библиотека действительно берет указатель на функцию (а не обобщенный Callable, такой как 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);
}
Другие вопросы по тегам