我正在为嵌入式系统编写程序,更具体地说是一个引导加载程序.我将使用C库与一些硬件组件进行交互,我可以选择用C或C++编写它.我有什么理由选择一个而不是另一个吗?我不需要C++的面向对象功能,但它确实有一个更强大的类型系统.它是否有其他语言功能可以使程序更健壮?我知道有些人会避免使用C++,因为它可以(但不总是)生成大型固件映像.
这不是一个特别简单的问题.这取决于许多因素,包括:
您希望如何布局代码.
是否有可用于目标的C++编译器(以及您可能希望使用引导加载程序的任何其他目标).
代码大小对你的应用程序有多重要(我们说的可能是额外的10%,而不是另一个答案建议的MB).
就个人而言,我真的很喜欢课程来表达我的代码.即使在编写C代码时,我也倾向于将所有内容保存在模块化文件中,文件范围静态函数"模拟"成员函数和(一些)文件范围静态变量来"模拟"成员变量.话虽如此,我现有的大多数嵌入式项目(所有这些都是相对较小的规模,最多包括128kB闪存,包括引导加载程序,但通常更少)都倾向于用C编写.现在我已经有了C++编译器,我当然正在考虑转向C++.
简单地使用引用,重载和模板,C++有很多好处,即使你没有像类那么远.当然,我不会使用许多更高级的功能,包括使用动态内存分配(新).然后,如果可能的话,我还要避免嵌入式C中的动态内存分配(malloc等).
如果你有一个C++编译器(即使它只是g ++),那么值得运行你的代码只是为了进行额外的类型检查,这样你就可以减少代码中的问题数量.C++编译器可以提供一些甚至静态分析工具都不会发现的东西.
有关人们拒绝使用C++的许多无效原因的详细讨论,请参阅Dan Saks在Embedded.com上的文章.
对于引导加载程序,显而易见的选择是C,尤其是在嵌入式系统上.生成的代码需要接近金属,并且非常容易调试,可能通过放入汇编,这很快就变得很难在C++中无需关注.此外,C工具链比C++工具链更普遍,允许您的引导加载程序在更多平台上使用.最后,生成的二进制文件通常较小,并且在编写C风格时使用较少的内存.
如果您不需要使用面向对象,请使用C.简单选择.它更简单,更容易,同时完成相同的任务.
一些顽固分子会不同意,但OO是使C++> C的原因,反之亦然.
除非有特殊原因要使用C++,否则我会使用C. 对于Bootloader,您实际上并不需要OO.
使用最简单的工具完成工作.
用C语言编写程序与用C++编写程序不同.如果你知道如何只在C++中这样做,那么你的选择就是C++.对于编写引导加载程序,最好将代码最小化,因此您可能必须禁用标准C++库.如果您知道如何用C语言编写,那么您应该使用C - 对于这类任务来说,它是更常见的选择.