Нужно написать код C из кода C ++? - PullRequest
0 голосов
/ 09 сентября 2010

Мне нужно записать мои 4-5 .cpp и .h файл в код c.В коде C ++ мы определили класс, конструктор, деструктор, функцию.

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

Ответы [ 5 ]

13 голосов
/ 09 сентября 2010
  1. преобразование всех классов в структуры данных (typedefs)
  2. замена конструкторов и деструкторов функциями, которые используют malloc / calloc и free, а также указатели возврата / принятия в ваши структуры typedef'd
  3. устранить полиморфизм;если это невозможно, тогда реализуйте функцию диспетчеризации сообщений для каждого typedef (большой оператор switch) и представляйте сообщения в виде константных целых чисел
  4. измените все функции, чтобы получить указатель на соответствующий typedef

Обратите внимание, что typedefs не поддерживают подтипирование, поэтому все наследование придется преобразовать в состав.

5 голосов
/ 09 сентября 2010

Есть много соображений и вещей, которые необходимо изменить, но я думаю, что вы хотите сделать, это эмулировать объектно-ориентированный код в C.

В основном для каждого из ваших классов вам нужно вынуть функции и оставить только члены-данные внутри класса / структуры (вы переименуете класс для структурирования и удаления открытых / закрытых / защищенных спецификаторов).

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

3 голосов
/ 09 сентября 2010

Почти весь типичный код OO C ++ - это просто шикарный синтаксис вокруг старой техники создания библиотек, которая создала «cookie» и требовала, чтобы он передавался при каждом вызове.Поэтому, если ни один из классов не имеет виртуальных методов (без диспетчеризации во время выполнения), вы должны быть в состоянии сделать следующее:

  • Думайте обо всех именах классов как об «средствах» или «библиотеках».
  • Поместите все члены данных класса в структуру с именем classname (то, что раньше назывался класс)
  • Превратите все методы в функции с именем classname_methodname.
  • Добавьте указатель наструктура имени класса к списку параметров всех функций (методов) для этого класса.
  • Превратите конструкторы в функции с именем classname_construct (возможно, # для перегрузок) и деструктор в функцию с именем classname_destruct.
  • Измените все вызовы методов в другом коде с objectname.methodname (...) на classname_methodname (objecname, ...).
  • Это сложная часть: вам придется ввести код для вызова деструкторов вручную, поскольку они автоматически вызываются вC ++.

Принимая пример, приведенный в комментариях:

class QtCommandData { 
public: 
    QtCommandData(unsigned short net,         unsigned short command, 
                  unsigned long n_data_bytes, unsigned short flgs, 
                  unsigned char* data = NULL); 
    QtCommandData(); 
    ~QtCommandData(); 
public: 
    unsigned char* m_pData; 
    int m_Async; 
protected: 
    unsigned int m_nDataBytes; 
    unsigned int m_BytesAllocated; 
protected: 
    int Fill_Trailer(); 
};

... становится (я сокращу "средство name "от QtCommandData до QtCD):

typedef struct {
    unsigned char* m_pData; 
    int m_Async; 
    unsigned int m_nDataBytes; 
    unsigned int m_BytesAllocated; 
} QtCD;

QtCD_Construct(QtCD * handle,
               unsigned short net,         unsigned short command, 
               unsigned long n_data_bytes, unsigned short flgs, 
               unsigned char* data); 
QtCD_Destruct(QtCD * handle);
QtCD_Fill_Trailer (QtCD * handle);

Это общая идея.Шаблоны, динамическая рассылка и некоторые другие вещи могут отбросить вас или два, но я уверен, что вы справитесь с этой задачей.: -)

2 голосов
/ 09 сентября 2010

Для функций вам также нужно запретить компиляции имен компилятором C ++, если вы хотите связать библиотеку C ++ с программой на C, поэтому вы добавляете блоки в свои заголовки, например

#ifdef __cplusplus
extern "C" {
#endif

 /* Some functions here */

#ifdef __cplusplus
}
#endif
0 голосов
/ 09 сентября 2010

C напрямую не поддерживает парадигму ООП.Перевод OO-проекта или кода на C - довольно простой механический процесс, но он не может быть полностью обоснован здесь, возможно.В теме уже есть хотя бы один поток: Можете ли вы написать объектно-ориентированный код на C? со ссылками на ресурсы.

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

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