在嵌入式平台上使用C++是完全可以的,只要你把它当作更好的C来使用。我喜欢这门语言稍微更加结构化的特点。你仍然可以用C做所有想做的事情。只需记得使用像Newlib或uClibc这样的嵌入式C库。
我特别喜欢我们可以使用C ++构建的抽象层,尤其是对于I/O设备。因此,我们可以为UART和GPIO等设备创建一个类。这比拥有一堆函数(在我看来)更加简洁。
取决于您的嵌入式系统的特定性质和您使用的C++功能。 语言本身并不一定比C生成更笨重的代码。
例如,如果内存是您最紧迫的限制,您可以只使用直接成员函数、禁用RTTI并且没有任何虚拟函数或模板来使用C++,就像“带类的C”一样。因为您没有类型信息、vtable或多余的函数来混杂事情,这将与等效的C代码几乎占用相同的空间。
当内存非常紧张时,我发现要避免的最大问题是模板,因为每个模板函数都会为其专门化的每个类型复制一个副本,这可能会迅速膨胀代码段。
在控制台视频游戏行业(这是嵌入式世界的强悍一端)中,C++是王者。我们的限制是内存上的硬限制(在当前世代上为512MB)和实时性能。通常使用虚拟函数和模板,但不使用异常,因为它们会使堆栈膨胀并且成本过高。实际上,一个主要制造商的编译器甚至根本不支持异常。
我不知道“普遍共识”,只知道我工作的公司(该公司为手机、汽车导航系统、DPF等开发了很多项目)。
在嵌入式平台上使用C++相对于C的主要缺点是它不太可移植 - 有许多编译器不遵循标准,这可能会在您需要使用多个编译器构建代码或实现中直接出现错误时引起问题。然后还有一些环境,C++代码根本无法运行 - BREW的可重定位代码问题和其“本地OOP”与“常规”C++类和继承不兼容。
最终,如果您只针对一个平台,我会建议您使用您认为更好(更快,更少的错误,更好的设计)的开发方式 - 在大多数情况下,这些问题可以很容易地解决。
这取决于你正在进行什么类型的嵌入式开发。我曾在各种平台上使用C++、C和汇编语言进行嵌入式开发,甚至可以使用Java编写智能手机应用程序。
例如,在运行Windows CE 5的类似智能手机的设备上,几乎所有代码都是C++,包括操作系统。只有一小部分是用C或汇编语言编写的。
另一方面,我曾为MSP430微控制器编写过C代码,如果编译器更可靠且符合标准,我可能会使用C++。
此外,我记得我的一位大学讲师谈到了使用Forth或其他语言编写嵌入式代码的情况。因此,任何语言都可以胜任。
现在,一切都取决于平台对C++运行支持的情况。您可能会发现使用GCC将C++代码编译成几乎适用于任何嵌入式平台的方法,但是如果无法找到适合该平台的C++运行时,则您的努力将徒劳无功,除非您自己编写C++运行时。
C++适用于没有操作系统的微控制器和设备。您只需要了解系统的架构,并在进行关键任务编程时特别注意时间和空间限制。
使用C++可以进行抽象,但这通常会导致代码占用更多的内存空间。当为资源受限的机器(如8位MCU)编程时,不希望出现这种情况。
一般而言,应避免以下情况:
对虚函数要谨慎,因为每个类都有一个vtable的资源成本,每个对象都有一个指向vtable的指针。此外,应该使用const来替换#define。
当您转向具有10到100 MB RAM的16位和32位MCU时,可以使用上述较重的功能。
总的来说,C++在嵌入式系统中非常有用。其主要优点是当你想要抽象微控制器的某些方面时,面向对象编程(OOP)非常有用,例如UART或状态机。但是,根据你所编程的目标,你可能希望始终避免某些功能,有时只使用部分功能。我目前正在处理一个嵌入式Linux应用程序中的异常问题。我们试图移植为另一个平台编写的软件,该平台似乎很好地支持异常,但新的编译器工具(gcc的一个移植版本)在创建eh_frame时报告错误。我反对在这个工具中使用异常,但开发人员向我保证现代编译器会很好地支持它。
我的观点是C++有一些优势,但我会避免使用异常和标准模板库。我们使用虚函数没有遇到问题。
在编程方面,我同意Linus的少数观点之一就是他对C ++的看法http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918
此外,如果您确实想使用C ++,您可能需要查看http://www.caravan.net/ec2plus/,该网站描述了嵌入式C ++,或者更好的说法是您不应该在嵌入式系统中使用C ++。