#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, просто скопировал и отредактировал исходный код, даже не заметил ошибок.