6

将我的项目从 C 转换为 C++ 时,我应该记住什么?有任何理由使用 C 吗?我现在唯一想到的是确保它对 DLL 友好,以便我可以在需要时创建一个 C 接口。

注意:我知道 C++ 就好了。模板、部分特化、为什么多重继承不好(我只看到过一种正确的用法)等等。我最想知道为什么我会使用 C 而不是 C++。DLL 和脚本语言绑定是原因之一。所以我只需要记住我应该有一个C接口来处理某些事情。还有别的事吗?

4

9 回答 9

17

冒着明显的风险,我想说要记住的主要事情是不要修复任何没有损坏的东西。

如果你有一个可用的 C 库,并希望它有一个更“C++ ish”的接口,那么将它包装在类中可能比转换它更聪明。当然,这满足了提供对 DLL 友好的 C 接口的要求:保留您已有的接口。

于 2008-11-17T23:14:49.273 回答
11

作为一名 C 程序员,当 C++ 程序员试图将 C“移植”到 C++ 时,我觉得很烦人。虽然使用 C++ 语言结构有许多优点,但它们并不总是比 C 的简单面向函数的方法有所改进。由于您始终可以通过 获得 C 功能extern "C",因此几乎没有理由更改工作代码。在我从事的项目中,围绕 C 代码创建对象包装器效果很好。这样,核心代码可以在使用任何一种语言的团队之间共享,每个人都可以使用与其环境相匹配的界面。我们甚至将一些 C++ 代码“反向移植”到 C 以鼓励代码重用。

我与几个不同的项目团队一起工作,这些团队使用围绕 C 核心的 C++ 包装器来访问数据库。一些团队使用 C++,而其他团队仅使用 C,但核心功能在团队之间共享。我们正处于维护期,所以即使 C 团队想要移植到 C++ 也是不可行的。我所看到的将 C 转换为 C++ 的尝试导致代码更长、更复杂,但没有更具表现力的代码。YMMV,当然。

于 2008-11-17T23:16:42.763 回答
8

由于我已经将一些C项目移植到C++中,然后才能传达我的经验:

我猜你真正的意思是“用已经可以正常工作的代码制作类和对象”,当你说你CC++. 这可能就是你正在做的事情。我想您想要进行移植的原因是使代码更可重用和可维护。请记住,我假设这是一个中型到大型项目(至少 10000 LOC)。

如果是这样,那么我可以想象你会遇到一些问题,但也是 C++ 中普遍遇到的问题:

制作时新引入的错误

'OO'**

由于 C 是过程性的,因此它将是对 C++ 中对象意义上的“可重用”的判断调用。有时你可能会发现你最初的观察是不正确的。不是因为您的代码无法编译,而是因为逻辑的执行方式与以前不同。在这种情况下:当您知道您的基本 C++ 对象没有破坏 C 程序的原始预期逻辑时,测试、测试、测试(增量)并在最后使用设计模式进行所有花哨的重构。

内存管理问题

CmallocfreeC++ 做非常不同的new事情delete。你的 C++ 对象分配将在很大程度上取决于你如何重新解释你对 C 代码正在做什么的理解,因此你需要在这两个方面都非常熟练。但最初我会保留 malloc 和 free 调用,并使用 C++ 抽象它们,除非有很好的理由不这样做。因此,一旦创建了类并分配和释放内存,您的应用程序就会发生内存泄漏。这是保证,也是您必须进行增量测试的原因。

重构和设计模式

我认为有时这种诱惑会因为继承和设计模式而疯狂,以使代码更加“leet”。尝试在移植开始时抵制这种诱惑,因为设计模式本质上是一种优化代码的方法,使其更高效和可维护,但考虑将 C 代码移植到 C++ 并考虑设计模式和重构和“废话现在它不起作用”和“在我必须改变它之前我使用了错误的设计模式”......正如你所看到的,它很快就会失控,所以一次只专注于做一件事让移植过程中的错误保持畅通无阻,这样您就不会不知所措。

全局变量

您将需要划分全局变量并找出限制其范围的位置。尝试通过一次创建一个简单的 C++ 对象来保留 C 代码的含义和功能,而在命名空间、继承、设计模式等方面没有任何花哨的东西。同样,我建议在您的代码转换为类之后做一些事情.

于 2010-08-09T18:43:06.013 回答
5

You can always include raw C code into a C++ project. So even if you have a C library which somewhat messes with C++, just use extern "C" {} for referencing, then call it inside your C++ code.

https://isocpp.org/wiki/faq/mixing-c-and-cpp

It is also perfectly possible to link C object files with C++ object files.

This (link to c++ Super-FAQ) is basically all you know to convert your project to C++ and stay legacy-compatible.

于 2008-11-17T22:40:57.203 回答
2

为什么多重继承不好

嘿,现在。多重继承可能非常好。这很容易被滥用。多继承的一个例子,它很好地继承了几个抽象基类。

于 2009-03-15T04:56:39.820 回答
1

有任何理由使用 C 吗?

尽管它变得越来越少,但仍然可以找到没有可行的 c++ 编译器的平台。ADI 的 Blackfin 芯片几年前就属于这一类,我不确定现在是否存在像样的芯片。

于 2008-11-18T01:12:16.510 回答
1

主要问题将是关键字。您是否使用过“new”、“private”、“public”等作为变量名?
除非您针对特定的嵌入式平台或内核模式驱动程序,否则没有必要再将自己限制为“c”。
当然,您不会通过简单地在 c++ 编译器中编写 c 代码来获得 C++ 的所有好处——它需要更多的重新思考!

于 2008-11-17T22:09:08.173 回答
0

Yes. C code seems to be simpler for smaller projects; LOC-wise and binary-wise.

于 2008-11-17T22:32:42.027 回答
0

Is there any reason to use C at all?

C++ code compiles much too slowly for small projects.
A long compilation disturbs the loop: write some code -> test it -> write more code -> test it ...

于 2008-11-17T22:56:07.797 回答