我的公司开发电机控制产品,我们正在使用STM32和IAR编译器进行开发。
我了解这两种语言之间的技术差异,我关注代码开发成本和维护成本:
- 编写C++代码的开发时间是否比C长?
- C++代码的维护成本是否比C便宜?(我知道代码总会有变化)
- 在C++中编写代码文档是否比C容易?(描述代码如何工作的文档)
这是非常主观的。我个人认为,对于大型、复杂的项目来说,在C++中开发花费的时间和维护成本要少得多。这是因为我见过的大部分复杂的C项目最终都会以某种方式实现C++的特性(例如多态性)。此外,我认为某些C++功能,如命名空间、数据封装和自动初始化/销毁对象等,可以增加大型项目的可维护性。虽然在C语言中,有一些类似的东西可以模拟出来,但效果有好坏之分。
但是您的情况可能会因为各种额外因素而有很大不同。例如,如果您的编程团队比较擅长C语言而不是C++,那么用C++可能并不值得。
i++;
会执行一个inc
指令(x86),而不是进行一个涉及各种操作的巨大函数调用。 - Earlzi
是一个int
还是一个具有重载递增运算符的用户定义类。此外,同样的论点也可以应用于C语言。i++
是否增加整数,或者将指针向上移动sizeof(*i)
?除非您(惊讶)知道类型,否则您无法知道,而这可以通过简单地瞥一眼源代码稍微往上看就可以轻松确定类型。 - Charles Salviai++
可能会调用一个浮点数仿真库中的函数。这与在C++中用户定义的运算符重载情况并没有太大区别。当然,在浮点仿真程序中,实际执行的工作量是有上限的,而在C++中,运算符重载所执行的工作量是没有上限的。但在两种情况下,只要代码写得好,就会完成必要的工作来进行后置增量操作,不会做过多的无用工作。如果您不想做那么多的工作,那么就不能对i进行递增。 - Steve Jessop团队经验决定了选择哪种语言。使用C++可以获得更丰富的库函数(但在嵌入式系统中要小心它们的占用空间)。
设计良好的C++代码比C代码更易于维护,因为它允许一些语法糖(构造函数、析构函数、RAII)。
文档编写成本大致相同。
如果有合适的C++开发者和编译器,那么应该坚持使用C++。
如果没有,那么你需要平衡学习曲线、项目复杂性(语言的适应性将会减轻它)和可用的编译器。
C语言的学习曲线较为简单:你的开发者更容易掌握语言的基本特征... C++是一种更大的语言,包含了C子集、模板子集、对象子集等,每个子集都与前一个子集非常不同。
事实上,用C++编写非常低效的代码是很容易的。这不是因为“语言很慢”,而是因为开发者有时会以错误的方式编写代码(通常是忽略C++语言中的非C部分,如引用等)。这是“学习曲线”问题的一部分。
但是一旦“学习曲线”结束,我们就可以看看语言的特点...
C语言相当直白。要么使用C的内置结构,这很容易(比如,添加两个整数...),要么不使用,那么就会出现错误,并且可能效率低下。
C++使避免资源泄漏、缓冲区溢出、内存或堆栈破坏变得容易。在C语言中,这些问题几乎会在每一行代码中发生。
通过内联和封装,C++使得可以高效安全地使用任何类型(即用户定义的类型)。通过模板和面向对象编程,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.
没有必要对这段代码进行文档记录。每个人都知道矩阵和乘法是什么。如果是 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...
}
http://www.stroustrup.com/JSF-AV-rules.pdf
如果C++足够好以this plane为例,那么我想C++对于许多不那么雄心勃勃的项目也是很好的选择... :-)语言选择与你所提出的三个问题几乎没有关系。选择你更有经验的语言,并且能够让你更加表达自如。
其实,两者都没有明显的优势。更多的是关于你如何使用它,而不是你使用的具体内容。
具体回答:
由于更强的数据类型和对象约束,你应该绝对使用C++ :)
我认为你提到的这三个点都取决于工具支持。 由于C++更难解析,而且静态分析也更难,因此可能只有一些工具适用于C。