В этой статье описывается, как вы можете смешивать C ++ и C в своем приложении.

Основанное на задачах разделение C и C ++

Хорошим подходом является использование C ++ в задаче пользовательского интерфейса и C во всех других задачах в вашем приложении.

Очевидно, что задача пользовательского интерфейса будет тесно связана с API TouchGFX и, следовательно, будет главным образом кодом C ++. Как объясняется в статье  «Подключение пользовательского интерфейса к вашей системе» , мы рекомендуем использовать механизм взаимодействия между задачами, предоставляемый вашей ОС, для обмена данными между задачей пользовательского интерфейса и оставшейся системой. Как правило, это будет означать отправку сообщений / писем, представленных в виде структур C между задачами. Такие структуры понятны как на C, так и на C ++, и, следовательно, обеспечивают удобный и переносимый интерфейс между UI Task (C ++) и любыми другими задачами в вашей системе (C или C ++).

Используя этот подход, вы можете получить весь не-GUI-код в вашей системе в виде обычного C-кода, а только GUI-задача - C ++.

Вызов функций C из C ++

Если вам нужно вызывать функции C из кода C ++, этого легко достичь, добавив объявление функции, окруженное extern "C":

Codefile.cpp:

extern "C"
{
  // function prototypes
  int func(); 
  // OR include header files containing C function declarations
  #include <example.h> 
}
/// func() and any functions in example.h can now be called from C++ code.

Вызов функций C ++ из C

Переход на другой путь требует немного больше работы. Строго невозможно вызвать C ++ из кода C, поэтому вам нужно будет создать функцию-оболочку C ++, которая использует искажение имен в стиле C, тем самым делая ее вызываемой из C.

Codefile.cpp:
// The extern declaration makes cpp_func callable from C
extern "C" void cpp_func();

// C++ wrapper function implementation.
void cpp_func()
{
  // C++ code
  HAL::getInstance()->someFunction();
}

mycode.c:
// Declaration of wrapper function
void cpp_func();

//cpp_func() is callable from this C code file.