2016-10-08 2 views
0

Как сделать 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; 
}; 
+4

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

+0

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

+0

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

ответ

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); 
} 
+0

Скомпилирует? Я пытаюсь сделать небольшой пример работы, и я должен что-то упустить. ':' Выглядит неуместным? – wally

+0

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

+0

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

Смежные вопросы