我是具有C语言和C++经验的电子工程师(我用C编写微控制器,用C++编写,用Borland C++ Builder编写的Windows)
我公司开发电机控制产品,我们正在使用STM32和IAR编译器.
我认识到语言之间的技术差异,我对开发海岸和代码的维护成本感兴趣:
Cha*_*via 17
这是非常主观的.我个人认为使用C++进行开发在开发时间和维护方面的成本较低,特别是对于大型复杂项目.这是因为我见过的大多数大型复杂C项目总是以这种或那种方式最终实现C++特性(例如多态).另外,我认为某些C++特性,如命名空间,数据封装和对象的自动初始化/破坏,增加了大型项目的可维护性; 虽然这些东西中的一些可以或多或少地被模仿到C中的不同程度的有效性.
但是,根据大量的其他因素,您的里程可能会有很大差异.例如,如果你的编程团队在使用C语言方面比C++有更多的经验,那么在C++中可能不值得这样做.
编写C++代码的开发时间是否比C长?
这完全取决于您的程序员.他们擅长写C或C++吗?
C++代码的维护成本是否比C便宜?(我知道代码总会有变化)
再次,将取决于您的程序员.您可以使用任何语言编写可维护或不可维护的代码.
用C语言编写针对C的代码是否容易?(描述代码如何工作的文档)
完全取决于您的团队和您正在使用的工具,但我想他们可能会大致相同.
总而言之,这一切都取决于你拥有的人和他们最擅长的人.如果你试图将一堆C程序员放在一个C++项目上,你可能会得到一些非常糟糕的C++.同样,如果你试图将一堆C++人员放在纯C项目上.
取决于所涉团队的经验.使用C++,您可以访问更丰富的库函数(但在嵌入它们时要小心它们的足迹).
精心设计的C++代码比C代码更容易维护,因为它允许一些语法糖(构造函数,析构函数,RAII).
文件的成本大致相同.
如果有合适的 C++ 开发人员和编译器,请坚持使用 C++。
如果没有,那么您将必须平衡学习曲线、项目复杂性(这将通过语言适应性而减轻)和可用的编译器。
在 C 中,该语言的学习曲线更容易:您的开发人员将更容易掌握该语言的基本功能...C++ 是一种更大的语言,包含 C 子集、模板子集和对象子集等等,每个子集都与前一个子集有很大不同。
事实上,使用 C++ 很容易产生非常低效的代码。不是因为“该语言很慢”,而是因为开发人员有时会以错误的方式进行编码(通常是忽略 C++ 语言的非 C 部分,例如引用等)。这是“学习曲线”问题的一部分。
但是一旦“学习曲线”结束,我们就可以看看语言特性......
C说的很直白。要么使用 C 的内置构造,这会很容易(例如,将两个整数相加……),要么不使用,并且很容易出错,而且效率可能很低。
C++ 可以轻松避免资源泄漏、缓冲区溢出、内存或堆栈损坏。在 C 语言中,这些几乎可能发生在每一行代码中。
通过内联和封装,C++ 可以轻松高效、安全地处理任何类型(即用户定义类型)。借助模板和 OOP,C++ 可以非常轻松地使用附加功能扩展某些类型。
当然,所有这些都假设 C 和 C++ 将具有同样高效的编译器......
C++ 对编译器做了很多假设。通过阅读 STL 实现,您会看到许多明显无用的函数调用,并且会想知道所有这些“花哨”的成本。事实上,编译器会将这些内联掉,使生成的二进制文件比您想象的要小。
但如果您的编译器无法做到这一点,那么 C++ 可能是一个坏主意。
1 - 编写C++代码的开发时间比C长吗?
这取决于项目的规模/复杂性,以及开发人员对所选语言的熟悉程度。如果您有 C++ 开发人员,请坚持使用 C++。
2 - C++代码的维护成本比C便宜吗?(我知道代码总是会发生变化)
同样,这取决于项目的规模/复杂性。它越复杂,您需要的架构就越多,因此,您需要的语言支持的功能就越多,然后使用 C++。
3 - 相对于 C 来记录 C++ 代码是否容易?(描述代码如何工作的文档)
我假设您正在谈论代码清晰度(即不是类似 Doxygen 的文档,它对于 C 和 C++ 的工作方式相同)。
这取决于您使用多少功能。例如,与 C 中的等效代码相比,使用 C++ 字符串是非常自然的。事实上,在 C++ 中使用复杂结构比在 C 中容易得多...
MyMatrix A, B, C ; // My Matrix is an user-defined object
// etc.
C = A * B ; // If you believe this is anything but a
// multiplication of two matrices, then
// you need serious medical help.
Run Code Online (Sandbox Code Playgroud)
无需记录此代码。每个人都知道什么是矩阵,什么是乘法。相同的 C 代码会更加冗长......
但是,C++ 也可能相当冗长。如果没有 foreach(如 Boost.FOREACH),编写一个循环来迭代 STL 容器中的每个项目可能会非常令人印象深刻:
for(std::map<int, std::string>::iterator it = myMap.begin(), itEnd = myMap.end() ;
it != itEnd ;
++it)
{
// Do something quite complicated...
}
Run Code Online (Sandbox Code Playgroud)
某些 C++ 语言功能在来自过程语言时甚至是不自然的,并且将成为学习曲线的一部分。如果开发人员没有做好准备,此类代码的编译器错误所产生的消息可能会破坏开发人员的理智。
:-)
因此,它再次取决于开发人员的 C++ 知识。
我一开始是一名 C 开发人员。在学习 C++ 后,我发现这门语言对我来说太复杂了,但我仍然认为 C++ 的一些功能在 C 中会很酷……从那时起,经过多年的经验,我的观点完全改变了。我再也不会用 C 语言编写代码了。
对我来说,没有任何意义:这就像限制自己骑自行车移动,而我可以选择使用自行车、汽车、飞机,甚至我的腿。
只要你的 C++ 编译器没问题,并且你的开发人员了解 C++(或者想学习 C++),C++ 就可以做 C 能做的一切(而且通常更好),甚至更多(记住,这是个人观点)。
显然,C++ 用于 F-35(“F-22 lite”)。以下文档很有趣,因为它显示了哪些 C++ 功能真正是零成本(因此具有积极影响),以及哪些 C++ 功能可能对软件产生负面影响:
http://www.stroustrup.com/JSF-AV-rules.pdf
如果 C++ 对于这架飞机来说足够好,那么我想 C++ 对于很多不太雄心勃勃的项目都有好处......
:-)