C++ 开发嵌入式软件库,C或C++;?

C++ 开发嵌入式软件库,C或C++;?,c++,c,embedded,C++,C,Embedded,我正在开发一个软件库,用于像ARM芯片或TI DSP这样的嵌入式系统(主要用于嵌入式系统,但如果它也可以用于PC环境也很好)。显然,这是一个范围相当广泛的目标系统,因此能够轻松地移植到不同的系统是一个优先事项。该库将用于与特定硬件接口并运行一些算法 我认为C++是C语言的最佳选择,因为它更容易维护和阅读。我认为,由于能够在面向对象的范例中工作,额外的开销是值得的。如果我是为一个非常特殊的系统写的,我会用C语言,但事实并非如此 我假设现在大多数流行嵌入式系统的编译器都可以处理C++。这是正确的吗

我正在开发一个软件库,用于像ARM芯片或TI DSP这样的嵌入式系统(主要用于嵌入式系统,但如果它也可以用于PC环境也很好)。显然,这是一个范围相当广泛的目标系统,因此能够轻松地移植到不同的系统是一个优先事项。该库将用于与特定硬件接口并运行一些算法

我认为C++是C语言的最佳选择,因为它更容易维护和阅读。我认为,由于能够在面向对象的范例中工作,额外的开销是值得的。如果我是为一个非常特殊的系统写的,我会用C语言,但事实并非如此

我假设现在大多数流行嵌入式系统的编译器都可以处理C++。这是正确的吗


我还有什么其他的因素要考虑吗?我的思路是否正确?

< P>如果可移植性对你来说非常重要,尤其是在嵌入式系统上,那么C肯定是比C++更好的选择。虽然嵌入式平台上的C++编译器正在迎头赶上,但是根本没有匹配C的广泛使用,任何自尊心的平台都有一个兼容的编译器。
<> P>此外,我认为C在接口硬件方面不如C++。抽象的数量足够低(即没有深层类层次),使C成为一个好的选择。嵌入式平台的

< P> C++编译器比83的C++更接近于98的C++标准,更不用说C++ 0x。例如,我们使用的一些平台仍然使用gcc-2.95的特殊版本进行编译

这意味着您的库接口将不能提供容器/迭代器、流或此类高级C++特性的接口。您必须坚持简单的C++类,它很容易用C接口表示为一个结构作为第一个参数。
这也意味着在您的库中,您将无法充分使用模板。如果你想移植,你仍然会被限制在通用容器的模板使用中,我敢肯定,你承认,只有C++ C++模板的一个非常小的部分。C++在信息隐藏、面向对象等方面有很多优点。如果你的嵌入式处理器在GC中得到支持,那么它也将被C++支持。

< P>对ARM有很好的C++支持。ARM有自己的编译器,g++也可以生成符合EABI的ARM代码。当涉及到DSP时,您必须查看他们的工具链来决定您要做什么。请注意,使用DSP的库可能无法实现完整的C或C++标准库。 C++适用于低级嵌入式开发,并用于SymbianOS内核。话虽如此,你应该让事情尽可能简单

  • 避免可能需要比现有库更多支持的异常(因此使用new(std::nothrow)Foo而不是new Foo)。
  • 尽可能避免内存分配,并尽早进行。
  • 避免复杂的模式。
  • 请注意,模板可能会使代码膨胀。
    在PC机上,C++完全不是问题——高质量编译器非常广泛,几乎每个C编译器都直接与C++编译器有很好的关联,尽管有一些例外,如LCC和新复活的PCC。 在工具链可用性方面,基于ARM的大型嵌入式系统通常与桌面系统非常相似。事实上,许多可用于台式机的工具也可以生成代码以在基于ARM的机器上运行(例如,许多机器使用gcc/g++端口)。TI DSPs的品种不多(并且更强调生成代码的质量而不是源代码特性),但至少还有几个值得尊敬的C++编译器可用。
    如果您想使用较小的嵌入式系统,情况会很快发生变化。如果你想能够像PIC或AVR那样的目标,C++就不是什么选择了。理论上,您可以(例如)让Comeau生成一个自定义端口,该端口生成您可以在该目标的C编译器上编译的代码——但很有可能,即使您这样做了,它也不会很好地工作。这些系统对于C++来说实在太有限(尤其是内存大小),很难适应它们。

    < P>我看到很多抱怨,C++是“臃肿”的,不适合嵌入式系统。 然而,在接受Stroustrup和萨特的采访时,Bjarne Stroustrup提到他看到了大量的模板化C++代码进入(IIRC)BMW的刹车系统,以及在战斗机的导弹制导系统中。

    我从中可以看出,语言专家可以生成C++中复杂、高效的代码,这当然最适合嵌入式系统。然而,一个“带类的C”[1]程序员如果不完全了解该语言,将生成不合适的臃肿代码

    问题可以归结为:您的团队可以用哪种语言提供最好的产品


    [1] 我知道这听起来有点贬义,但我要说的是,我认识很多这样的人,他们编写了大量相对简单的代码来完成这项工作。

    这取决于您对库的预期用途,我想我建议先把它作为C来实现,但是设计应该牢记它如何被纳入C++设计。然后在C实现的顶部和/或旁边实现C++类(没有理由不与第一个并发同时执行此步骤)。如果你的C设计是用C++设计完成的,那么它可能是干净的,读的。