需要从C ++代码编写C代码?

时间:2010-09-09 16:11:51

标签: c++ c linux

我需要将4-5 .cpp和.h文件写入c代码。在C ++代码中,我们定义了一个类,构造函数,析构函数,函数。

如何用C代码转换它们? 有人可以给我一些例子,以便我可以实现它或提供链接,以便我可以更好地探索我的C代码吗? 如何实现所有功能我的意思是构造函数,析构函数,C语言中的类函数

5 个答案:

答案 0 :(得分:13)

  1. 将所有类转换为数据结构(typedef)
  2. 用使用malloc / calloc和free的函数替换构造函数和析构函数,并返回/获取指向typedef结构的指针
  3. 消除多态性;如果这是不可能的,那么为每个typedef(一个大的switch语句)实现一个消息调度函数,并将消息表示为常量整数
  4. 更改所有函数以获取指向相应typedef的指针
  5. 请注意,typedef不支持子类型,因此必须将所有继承转换为合成。

答案 1 :(得分:5)

有许多需要改变的注意事项和事情,但我认为你想做的是用C模拟面向对象的代码。

基本上,对于每个类,您需要取出函数并仅将数据成员保留在类/结构中(您将类重命名为struct并删除public / private / protected说明符)。

然后你需要为每个函数添加第一个参数,这是一个指向要操作的结构的指针。

答案 2 :(得分:3)

几乎所有典型的OO C ++代码都是围绕创建库的旧技术的时髦语法,这些库创建了一个“cookie”并要求将其传递给每个调用。因此,如果没有类具有虚拟方法(没有运行时调度),您应该能够执行以下操作:

  • 将所有类名称视为“设施”或“库”名称。
  • 将类的所有数据成员放入名为classname的结构(该类曾用于命名)
  • 将所有方法转换为名为classname_methodname的函数。
  • 将指向classname结构的指针添加到该类的所有函数(方法)的参数列表中。
  • 将构造函数转换为名为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(); 
};

...变成(我会将“设施名称”从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);

这是一般的想法。模板和动态调度以及其他一些事情可能会给你带来一两次,但我相信你能够应对挑战。 : - )

答案 3 :(得分:2)

对于函数,如果要将C ++库链接到C程序,还需要阻止C ++编译器进行名称修改,因此在标题中添加块,如

#ifdef __cplusplus
extern "C" {
#endif

 /* Some functions here */

#ifdef __cplusplus
}
#endif

答案 4 :(得分:0)

C不直接支持OOP范例。将OO设计或代码翻译成C是一个相当简单的机械过程,但也许不能在这里合理地完全涵盖。主题上至少有一个主题:Can you write object-oriented code in C?包含指向资源的链接。

如果您的代码使用更复杂的C ++特性,例如泛型编程,多态和多重继承,那么您的工作可能比它的价值更难。但是,C和C ++可以相当容易地进行互操作。为什么你不只是提供C类的C包装?

相关问题