嵌入式开发也可以用C++?

2019年, EE Times 曾对嵌入式项目中的编程语言做过一个调查。其中,C语言以56%的占比稳居第一,C++以23%紧随其后。手头的嵌入式开发项目也是用的C++,于是想总结一下嵌入式中C++的使用心得。

嵌入式开发也可以用C++?_第1张图片

在嵌入式开发中,按照应用领域可以简单划分为:单片机 MCU,Linux 驱动/应用。在嵌入式Linux开发中,C++已经是绝对的应用层主力之一。本文所针对的应用领域主要是单片机MCU开发。

1. 为什么要用C++取代C呢?

C++是C的超集,有许多C语言不具备的优势:

  • 面向对象编程特性,能够通过接口实现底层代码。简单说,就是 C with class。
  • 许多C语言不存在的特性:templates,多态,运算符重载等等。
  • 通过接口的方式隐藏底层的实现。
  • 通过将代码的变化封装在一个对象上,最大限度地减少重复测试和维护。
  • 由于将一切封装在功能单元中,可以提高代码的重复使用。
  • 更加严格的类型检查,可以减少bug。

当然,以上方法大部分都可以通过C来实现,比如C++的类可以用C的函数指针来实现,但是大量的函数指针不仅会降低代码的可读性,也会极大地增加代码量。C++则可以在编译器层面有效改善这种情况,主流单片机的编译器也已经兼容C++。

2. 不适用于嵌入式的C++特性

C++特性更多,功能更强大,但是受到单片机资源和应用场景的限制,并不是所有特性都适用。以下项目尤其需要特别注意:

  • 开发成本很高的特性:STL 库,异常处理,运行时类型信息(RTTI) 。 
  • 由于安全方面的原因,一些特性也是不推荐的。
  • 有时候很难确定你的源代码和反汇编之间的关系。
  • 事件驱动型代码很难理解和调试。

3. C++的低效性

一直有一种声音认为C++在嵌入式系统中比较低效,无论是速度还是大小,这到底是事实还是偏见?下边我们将C++的特性,与C语言实现效率进行对比,按照性价比由高到低可以分为三个等级:

  • 高性价比:没有额外成本。
  • 中性价比:带来少量的成本。
  • 低性价比:成本非常高。

将C++的特性对号入座,我们便有了下边这张图。其中,Templates 模板比较特殊,性价比的高低取决于具体的应用。在我们的嵌入式项目中,就是用Templates实现的底层代码,后期可以单独写一个例子。

嵌入式开发也可以用C++?_第2张图片

那么,如何从C逐步过渡到C++呢?有如下参考:

  • 始终使用一个命名惯例,区别类型、字段和变量的命名。
  • 注意显式类型转换,比如从一个通用的类型 void* 或者 int 转换到 int* 或者 enum 时。
  • 为你使用的所有函数声明原型。
  • 显式确定你所用的类型,切勿相信隐式的返回值或变量的类型。
  • C++可以调用原有C项目的代码。

最后,在网上看到很多对比C++与C的文章,十分认同一句话——“作为开发者,编程思想远远比语法糖重要的多。C with Class是编程思想的进步,虽然在语法难度上面它不值一提。”

相关参考:C++在嵌入式中表现如何? - 知乎

你可能感兴趣的:(嵌入式,C/C++,c++,开发语言)