C ++到C转换工作流程

时间:2015-02-06 07:53:23

标签: c++ c

首先,我不是在寻找一种能够从现有的cpp代码库中生成无法维护的C代码的工具。这是客户的要求,所以我不能只使用CPP代码库本身。

我正在尝试制定工作流程,以便我可以在不破坏代码的情况下逐步将代码库从CPP转换为C.我已经考虑了一些使用" extern C"方法

  1. 类别到结构
  2. Classes的成员函数将转换为Struct_name_FunctionName格式。
  3. 如果函数被2个类重用,我打算使用函数指针。
  4. 用实际函数替换+, - 等重载运算符。例如Add_,Sub_ etc
  5. 你们可以再添加一下吗? 并指出潜在的陷阱? 由于NDA,我无法共享代码库。 代码库本身并不庞大。它有大约50个cpp文件,看到了100多个类。

    提前致谢。

    P.s我已经经历了其他一些听起来相似的问题。但他们并没有真正拥有我正在寻找的工作流程。

    [结束]:尽管该帖子因为过于宽泛而被搁置,但许多评论实际上都很有用。我比以前更清楚需要做什么。谢谢。

3 个答案:

答案 0 :(得分:9)

嗯,你需要解决一个很长的清单。在没有声称完整的情况下,您还需要:

  1. 虚拟功能支持(不可能很难,功能指针表)
  2. 构造函数和析构函数(合理映射到普通函数,大量工作)
  3. 异常和堆栈展开(极其困难)
  4. 缺少C ++库函数和类(很多工作)
  5. 但不要自欺欺人。 std::map<std::string, std::pair<int, int>>是一个非常简单的类,为每个字符串存储两个int。该课程的C语翻译完全混乱。 MyMap["five,three"] = std::make_pair(5,3)可以很容易地成为100多行C代码。

答案 1 :(得分:4)

如果您的C ++代码广泛使用OO结构 - 特别是继承和多态 - 您可能希望查看一些在C中模仿它的C库.qobject(来自qemu源代码树)是我熟悉的,但更好已知(几乎每个人都禁止我)是http://en.wikipedia.org/wiki/GObject来自油嘴滑舌。如今,这与GUI代码无关。

这里的优点是您可以更改使用中的语言,而无需对程序流进行太多更改。

glib还提供了许多其他有用的库构造。

答案 2 :(得分:2)

遵循建议以GObject为例,如何用C语言完成C ++代码,你可以尝试一下:

  1. 将C ++代码翻译为Vala
  2. 从Vala编译器生成C代码。
  3. Vala是一种类似C#的语言;除了你必须在每个函数签名中重复“公共”或“私有”,以及在使用的类类型中摆脱指针星,你不需要做太多事情。

    当然,生成的C代码看起来与其他生成器看起来一样难看,但至少有一些简短的方法可以使它成为一个“可维护”的代码(主要问题是在Vala结果中创建的每个对象)在C代码中递增引用计数器,这并不总是必要的。)

    GObject模型可以是一个很好的指令/示例,关于如何在C中将C ++构造转换为相同的。如果你不使用异常(Vala会这样做:)),那应该没有问题。当然主要的指导方针是:

    1. 普通方法:使用指向对象的指针作为第一个参数。函数名称为NAMESPACE_CLASSNAME_METHODNAME。
    2. 虚拟方法:您必须创建一个“特征对象”,由该类的“对象”指向,该对象包含指向函数的指针。类的特征对象通常在GObject中在返回指向该对象的指针的函数中创建 - 对象本身是懒惰创建并保存在静态局部变量中。
    3. 重载:添加名称区分部分(Vala不支持重载,即使在构造函数中 - 构造函数也使用特殊语法来调用命名构造函数)
    4. 模板:扩展到位:)。
    5. 派生:仅单一派生(如Vala中所示),使“派生类”结构的第一个字段成为“基类”结构类型的字段。
    6. 从基类调用方法:使用C cast。如果你遵循第5点,你应该简单地将派生类对象的结构强制转换为基类的结构。