【问题标题】:Compile GNU C project with C++使用 C++ 编译 GNU C 项目
【发布时间】:2016-02-10 08:59:34
【问题描述】:

我刚加入一个项目,有一堆代码(在过去 5 年里由 4 或 5 个不同的人编写)。此时全是 C,但我想将项目迁移到 C++ 以利用 OOP。

第 1 步将简单地保留所有现有代码,并选择性地将非常小的功能片段转换为面向对象的功能。

我的理解是C可以用C++编译,但也许我错了。

那么,在我投入大量时间尝试实际操作之前,我是否能够相对轻松地使用 C++ 编译现有的 C 代码?

或者,这可能需要大规模迁移才能奏效?

哪些因素会影响我提议的任务的复杂性?

所以要明确一点 - 我不是询问将所有代码转换为对象、将函数转换为方法等的项目有多大 - 而是我是什么可能面临使用 C++ 编译器而不是 C 编译器来编译现有 C 代码。

提前致谢 - 我期待您提供任何帮助/指导。

编辑

听起来这真的不是一个好主意。我一直认为 c++ 是 C 的扩展,但听起来它们的不同之处在于这不是一条可取的路径。最终,我并不认为它们是不同的语言,而是希望 c++ 比听起来更向后兼容 c。我最初的搜索看起来人们已经在不同程度上取得了成功,但这里的回答让我觉得我真的应该把它们看作是两种不同的语言。谢谢!

【问题讨论】:

  • 很多时候,C代码用C++编译器不用修改也能编译好,但能不能保证,我不知道。
  • 事实上,大多数实质性的 C 代码都不是有效的 C++(不同的关键字、不同的转换规则会影响malloc 的大多数用途……)但通常可以机械地移植。
  • 为什么你觉得你需要使用你几乎一无所知的现有代码并用不同的语言编译它?
  • C 和 C++ 是不同的语言。虽然您当然可以将 C 代码移植到 C++,但不要期望相同语法具有相同的语义。您必须对两种语言都足够了解才能移植。更不用说名副其实的端口将使用该语言提供的功能。因此,通常重新实现往往是更好的方法(然而,老板们不太懂 muss - 因为他们不懂语言)。
  • 第一步是与其他开发人员协商并确保他们都想更改项目的语言

标签: c++ c ubuntu gnu


【解决方案1】:

我一直认为 c++ 是对 C 的扩展,但听起来它们的不同之处足以让这不是一条可取的路径。

C++ 不是 C 的扩展。它们是完全不同的语言。用 C++ 编译 C 代码不仅仅是启用“OO 模式”。当您使用 C++ 编译器编译除琐碎的 C 代码之外的任何内容时,由于两种语言之间的差异,您可能会向自己敞开心扉。

我是否能够相对容易地让现有的 C 代码使用 C++ 进行编译?

同样,您有一个根本的误解——C++ 不是 C 的扩展版本。它们是不同的语言。

最好的做法是将代码慢慢迁移到 C++,但使用两个不同的编译器。用 C 编译器编译 C 代码,用 C++ 编译器编译 C++ 代码。这不是一项具有挑战性的壮举,因为任何现代编译器套件(如 GCC 和 clang)都可以很好地编译 C 和 C++。

这是否可能需要大规模迁移才能发挥作用?

如果您打算将代码转换为 C++,那么可以。

有一点值得一提:如果您使用 C++ 编译器编译您的 C 代码,并称其为 C++ 编程,那么您就失去了 C++ 开发环境的精神。如果您使用 C++ 编程,但使用很少 OO 的 C 代码,那么使用 C++ 的意义何在?只需跳过 OO 和 C 代码的开销。使用 C++ 编译器并不是什么神奇的过程,可以立即让您的代码变得更好。

【讨论】:

  • 谢谢 SevenBits。这正是我想知道的。就你的最后一段而言,我没想到这是一个神奇的过程。相反,我希望能够将项目逐步迁移到面向对象的框架中。换句话说,首先让现有的 C 用 C++ 编译,然后开始设计新代码(作为对象),以开始将过程 C 代码迁移到更面向对象的设计的过程。这篇文章非常清楚地表明它们是完全不同的语言,这种方法根本行不通。谢谢!
  • 对。我会一次将它迁移到 C++ 一个源文件。使用 C++ 编译器编译新的 C++ 文件,任何剩余的文件都应使用 C 编译器进行编译。然后,您可以使用链接器将所有内容组合到一个应用程序、库等中。
  • 谢谢。我会进一步调查。再次感谢大家的帮助 - 这正是我希望澄清的!
【解决方案2】:

我认为您应该查看here 以获取(可能的)问题列表。

我过去为 C 到 C++ 的管理所做的就是让 C 代码按应有的方式工作(使用 C 编译器编译的 C 代码),并同时在 C++ 中从头开始重写代码。

【讨论】:

  • 那个链接有点过时了。 C++11 为 C++ 添加了相当多的更改/添加,就像 C99 对 C 所做的一样。C11 更改较少,但仍然更改了某些方面。不过,你的说法是个好主意。
猜你喜欢
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多