我正在为嵌入式系统编写程序,更具体地说是引导加载程序。我将使用 C 库与一些硬件组件进行交互,我可以选择用 C 或 C++ 编写它。有什么理由我应该选择其中一个吗?我不需要 C++ 的面向对象特性,但它确实具有更强大的类型系统。它是否有其他语言特性可以使程序更健壮?我知道有些人避免使用 C++,因为它可以(但并非总是)生成大型固件映像。
9 回答
这不是一个特别容易回答的问题。这取决于许多因素,包括:
- 您喜欢如何布局代码。
- 是否有可用于您的目标的 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。对于引导加载程序,您实际上并不需要 OO。
使用最简单的工具来完成这项工作。
用 C 编写程序与用 C++ 编写程序不同。如果您只知道如何在 C++ 中执行此操作,那么您的选择就是 C++。为了编写引导加载程序,最好尽量减少代码,因此您可能必须禁用标准 C++ 库。如果您知道如何用 C 编写代码,那么您应该使用 C——它是此类任务的更常见选择。
以前的大多数答案都假设您的引导加载程序小而简单,这通常是这种情况;但是,如果它变得更复杂(即您需要能够从以太网端口、USB 端口或串行端口加载……您需要在清除现有代码之前验证正在加载的代码,等)您可能需要考虑 C++。
我还发现引导加载程序和应用程序通常共享一些公共代码,因此您可能还需要考虑使用与应用程序相同的语言来促进代码共享。
使用 C++ 并选择您需要的语言功能。只要您了解您正在使用的 C++ 抽象,您仍然可以完全控制输出对象代码。
如果避免使用虚函数,OO 的使用仍然可以很好地运行。避免需要大量复制才能传递值的不可变对象类型,例如 std::string。但是,您仍然可以使用模板等功能,而不会对运行时性能产生任何实际影响。
C 语言比 C++ 更容易解析。这意味着同时是有效 C 和有效 C++ 的程序将作为 C 程序编译得更快。可能不是一个主要问题,但这只是 C++ 可能过度杀伤的另一个原因。
将C与µClibc一起使用。它将使您的代码更简单并减少其占用空间。可在以下网址找到:www.uclibc.org。