Учитывая, что вы не можете изменить параметры сообщения cb к сожалению один из способов инициализации обратного вызова с настраиваемым значением - создать переменную extern
, возможно в файле .h
, обеспечивающем видимость для любого файла .c
, которому требуется его текущее значение или адрес (в зависимости от того, как определен экземпляр ):
.h файл
//declare project global here
extern <type><name>;
file1. c
//define project global here
<type><name> = somevalue;
Примечание: Предшествующая идея была предложена до того, как OP-многопоточная среда была вероятна в ответ на комментарии в первоначально размещенный вопрос.
В ответ на комментарий о многопоточности ...
Если есть какой-либо глобальный объект (сообщение, значение, некоторый другой объект) должен использоваться в многопоточной среде, тогда он должен быть защищен таким образом, чтобы контролировать доступ к его значению и изменять его путем создания, например, одним из двух следующих способов:
- использовать структуру блокировки (например, мьютекс) для защиты разделяемой переменной с использованием критической секции .
- использует атоми c для доступа к объекту, новый стандарт C, C11 поддерживает эту конструкцию.
... или использовать их таким образом, чтобы окружить их критическими секциями защищенного кода, как, например, можно сделать с помощью блокировки.
Есть много учебных пособий по этой теме c, например. this .
Вот быстрый и грязный пример концепции использования безопасности потоков с помощью блокировки:
// Your function modified with pseudo code for concept illustration
//static void init(Chat *instance)
static bool init(Chat *instance)
{
bool status = FALSE;
struct ts_lock lock = {0};
get_lock(&lock);
if(lock.granted)
{
//populate message from instance here
// <some code to populate 'message'>
callback_message(void (int friend_number, char const *message) {
// Here I can access `instance`
status = TRUE;
release_lock(lock);
}
return status;
// ...
}