Вызов методов класса C ++ из C с использованием обратных вызовов - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть класс Component, который должен взаимодействовать с кодом C.

//// Component.h file   ////
class Component{
public:
    uint8_t getdevice1Value();
    void setdevice1Value(uint8_t value);

    uint8_t getdevice2Value();
    void setdevice2Value(uint8_t uint8_t);
private:
    uint8_t device1Value;
    uint8_t device2Value;
}

Объект класса будет создан, когда его соответствующий поток будет создан в каком-то файле Application.cpp:

///////Some function where the Component is used//////
createThread(){
    Component myComponent;  // Scope within the thread
    // Some actions
}

Теперь приходит мой код C, который происходит с быть ориентированным на события. В этих функциях я хотел бы связать свои методы класса:

//// device1_event.c file   ////
void command_get_device_value()
{
    // code
    // assign variable  = Component::getdevice1Value() function
    // code
}

void command_set_device_value()
{
    // code
    // call Component::setdevice1Value(variable)  passing some variable
    // code
}

Подобно файлу device1_event. c, у меня есть еще одно устройство device2_event. c, где я хотел бы сопоставить вызовы функций с getdevice2Value и setdevice2Value.

Я посмотрел на вопросы Использование функции-члена класса C ++ (не может быть stati c) в качестве C функции обратного вызова или также Передайте функцию-член C ++ функции C , где struct регистрирует контекст и указатели функций.

У меня есть ограничение в том случае, если я не могу динамически c распределение. Таким образом, я не могу использовать оператор new.

Теперь у меня есть несколько вопросов относительно них:

  1. Применима ли концепция callback в моем случае?
  2. Если первый вопрос - да, тогда:
    • Как мне go рассказать о его реализации. Я немного запутался по этому поводу. Я имею в виду, что call-функции должны быть помещены в C -функции, а также мне нужно зарегистрировать их после создания экземпляра Component. Как я могу это сделать?
    • Как добавить функции обратного вызова в мои C файлы?
  3. В этом вопросе a struct был нанят. Где я могу объявить «структуру»? Я попытался объявить его в файле Component.h и представил его как extern в файле device1_event.c. Но я получаю incomplete type ошибку.

1 Ответ

1 голос
/ 14 апреля 2020

Классический C способ передачи обратных вызовов заключается в передаче двух значений: указателя на сам обратный вызов и непрозрачного указателя, который будет передан обратному вызову в качестве дополнительного аргумента (посмотрите на qsort_r например). При взаимодействии с C ++ это непрозрачное значение может использоваться как указатель экземпляра; вам нужно будет только написать тонкую оболочку:

class B {
    void my_callback(int arg);
    static void my_callback_wrapper(int arg, void *u) {
        ((B*)u)->my_callback(arg);
    }
};

// or even:
extern "C" void my_callback_wrapper(int arg, void *u) {
    ((B*)u)->my_callback(arg);
}

и передать указатель на оболочку, а также указатель на объект на часть C. Будьте осторожны, чтобы использовать один и тот же тип класса с обеих сторон, а не базовые / производные классы, например.

Обратите внимание, что, хотя может быть возможно получить указатель на (non-stati c) метод На некоторых компиляторах (проверенных на MSV C долгое время go) они имеют специальное соглашение о вызовах, так что указатель не будет совместим с любым указателем обычной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...