C++ 用C或C+编写引导加载程序+;?

C++ 用C或C+编写引导加载程序+;?,c++,c,bootloader,embedded,C++,C,Bootloader,Embedded,我正在为嵌入式系统编写一个程序,更具体地说是一个引导加载程序。我将使用C库与一些硬件组件进行交互,我可以选择用C或C++编写。有什么理由让我选择一个而不是另一个吗?我不需要C++的面向对象特性,但它有更强大的类型系统。它是否还有其他语言功能可以使程序更加健壮?我知道有些人避免C++,因为它可以(但不总是)生成大量的固件映像。 < P>如果你不需要使用对象定位,那么就用C简单选择。它更简单,更容易,同时完成同样的任务 有些顽固派会不同意,但是OO是C++的一个重要组成部分,在很多情况下都是相反的。

我正在为嵌入式系统编写一个程序,更具体地说是一个引导加载程序。我将使用C库与一些硬件组件进行交互,我可以选择用C或C++编写。有什么理由让我选择一个而不是另一个吗?我不需要C++的面向对象特性,但它有更强大的类型系统。它是否还有其他语言功能可以使程序更加健壮?我知道有些人避免C++,因为它可以(但不总是)生成大量的固件映像。

< P>如果你不需要使用对象定位,那么就用C简单选择。它更简单,更容易,同时完成同样的任务


有些顽固派会不同意,但是OO是C++的一个重要组成部分,在很多情况下都是相反的。

< P>对于一个特定的任务,作为引导程序,我绝对不会使用C++。我认为标准的C++库至少是一对MB,而不是Bootloader中想要的。C与

< P> > C中的程序与C++编写程序不一样。如果你知道如何在C++中做,那么你的选择就是C++。为了编写Bootloader,最好将代码最小化,因此可能需要禁用标准C++库。如果您知道如何用C编写,那么您应该使用C—这是此类任务的常见选择。

对于引导加载程序来说,最明显的选择是C,尤其是在嵌入式系统上。所生成的代码需要接近金属,并且很容易调试,可能通过进入汇编,这很快变得困难,而不关心C++。此外,C工具链比C++工具链更普遍,允许引导加载程序在更多平台上使用。最后,生成的二进制文件通常较小,并且在编写C风格时使用更少的内存。

< P> C语言比C++更容易解析。这意味着一个程序既有效C又有效C++将编译更快的C程序。可能不是一个主要的问题,但这只是C++可能被过度使用的另一个原因。

< P>这不是一个特别简单的问题。这取决于许多因素,包括:

  • 您喜欢如何布局代码
  • 是否有C++编译器可用于目标(以及任何其他目标,您可能希望使用引导加载程序)。
  • 代码大小对您的应用程序有多重要(我们所说的可能是额外的10%,而不是另一个答案所建议的MB)
就我个人而言,我真的很喜欢用类来展示我的代码。即使在编写C代码时,我也倾向于将所有内容保存在模块化文件中,其中包含文件范围静态函数“模拟”成员函数和(少数)文件范围静态变量“模拟”成员变量。话虽如此,我现有的大多数嵌入式项目(所有这些都是相对较小的规模,最多包括128KB Flash,包括Bootloader,但通常较少),往往倾向于用C编写。现在,我有一个C++编译器,但我确实考虑迁移到C++。 对于C++来说,简单地使用引用、重载和模板有很大的好处,即使你没有达到类。当然,我会停止使用许多更高级的功能,包括使用动态内存分配(新)。同样,如果可能的话,我也会在嵌入式C中避免动态内存分配(malloc等)

如果你有一个C++编译器(即使它只是G++),那么只需运行额外的类型检查就可以运行你的代码,这样你就可以减少代码中的问题数。C++编译器可以拾取一些静态分析工具不会发现的东西。


<>为了讨论很多无效的原因,人们拒绝C++,参见.p/>,除非有特殊的理由使用C++,否则我会使用C。对于引导加载程序,您并不真正需要OO


使用最简单的工具来完成这项工作

CµClibc一起使用。它将使您的代码更简单,并减少其占用空间。可以在以下内容中找到:。

前面的大多数答案都假设引导加载程序很小且很简单,这是典型的情况;但是,如果它变得更复杂(即,您需要能够从以太网端口、USB端口或串行端口加载……您需要在卸载现有代码之前验证正在加载的代码),您可能需要考虑C++。
<>我也发现,引导加载程序和应用程序通常共享一些共同的代码,所以您也可以考虑使用与应用程序相同的语言来促进代码共享。

< P>与C++和Objo一起选择您需要的语言特征。只要了解所用的C++抽象,就可以完全控制输出对象代码。


如果避免使用虚拟函数,OO的使用仍然可以很好地运行。避免需要大量复制才能传递值的不可变对象类型,如std::string。但是,您仍然可以使用模板之类的功能,而不会对运行时性能产生任何实际影响。

您也可以用C编写OO,事实上几乎可以用任何语言编写OO,因为您可以在结构中收集数据,并编写在其上操作的方法;就这样结束了。是的,但我想凯尔知道这一点。一个很好的回答,我是C和C++的粉丝,OO是在很多情况下使C++ +C的意思。“你可以用任何语言写OO”——OOP不是关于“在结构上使用方法”,而是关于动态绑定方法。如果你已经在C++中使用了VC++,那么在C中实现一个VTLE机制是不合理的。OOP支持可能是最不喜欢C++的原因,尤其是在嵌入式设置中。正如Al的答案所示,C++包含大量的改进,这些改进只会产生比C更好、更健壮的代码,但不以任何方式出现。