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

在嵌入式开发中,按照应用领域可以简单划分为:单片机 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逐步过渡到C++呢?有如下参考:

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

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

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

嵌入式开发也可以用C++?相关推荐

  1. 嵌入式开发在过去20年中是如何演变的

    嵌入式开发在过去20年中是如何演变的 How embedded development has evolved over the past two decades 与任何开发领域一样,嵌入式系统开发就 ...

  2. 嵌入式开发「坑」太多?MathWorks 高级工程师教你 debug

    文/ 朱雪妍 据博思数据发布的<2018-2023年中国嵌入式软件行业市场发展现状调研与投资趋势前景分析报告>表明:2018年上半年我国嵌入式系统软件收入达4240.2亿元,累计增长6.6 ...

  3. 嵌入式开发中DSP与FPGA的关系

    嵌入式开发中DSP与FPGA的关系 常所说的单片机侧重于控制,不支持信号处理,属于低端嵌入式处理器,arm可以看做是低端单片机升级版,支持操作系统管理,更多接口如网卡,处理能力更强;fpga是可编程逻 ...

  4. 嵌入式开发输出调试信息的几种方法(常规法及非常规法)

    这篇文章对于研发查找问题和测试都有很大帮助,在这里保存记录一下. 论语>有云:"工欲善其事,必先利其器".输出调试信息是软件开发中必不可少的调试利器,在出现bug时如果没有调 ...

  5. 重磅直播|嵌入式开发漫漫之路—从小白到技术骨干

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  6. c语言嵌入式开发单片机,嵌入式开发|单片机基础

    嵌入式开发它是一个综合的技能学习,既要去学习基本的Linux编程,又要学习物理机的操作使用,要想学习嵌入式的开发,在前面的文章中已经是跟大家说过了,嵌入式开发的学习需要掌握的基础课程还是比较多的,单片 ...

  7. Google 开源 Pigweed,涉足嵌入式开发

    2020-03-22 14:22 导语:虽然 Google 声明这并不是操作系统,但谁知道下一步呢? 雷锋网AI源创评论报道,Google 不久前在官方博客上宣布了开源 Pigweed 的消息.[1] ...

  8. 嵌入式开发从业人员生存状况

    为什么80%的码农都做不了架构师?>>>    据调查数据显示,嵌入式开发人才需求目前仍然是供不应求,接近80%参与调查的工程师都表示,自己公司目前都急缺嵌入式开发方面的人才.专业的 ...

  9. rust做嵌入式开发_Rust 嵌入式开发 STM32 amp; RISC-V

    Rust 嵌入式开发 STM32 & RISC-V 发布于 2020-04-03 11:07:06 本帖最后由 wuhanstudio 于 2020-4-3 11:58 编辑 更新地址: [m ...

  10. 嵌入式开发 ---必看图书

    1.<linux驱动设备驱动开发详解> 基于linux4.0 是目前主流的 嵌入式开发用的系统 整个开发流程很详细,是嵌入式开发的入门之选,在2021年之前是没有任何图书有这么详细的教程的 ...

最新文章

  1. c语言课设代写一般多少钱_厕所疏通一般多少钱
  2. Java、Android静态代理与动态代理
  3. StringBuffer、StringBuilder、ArrayList、Vector、HashMap、HashTable 的扩容机制
  4. 提高Python程序运行效率三种模式第一种:多进程multiprocessing模块
  5. Java黑皮书课后题第5章:5.13(求满足n的三次方<12000的n的最大值)使用while循环找出满足n的三次方<12000的n的最大值
  6. 检查列表中的所有元素在Python中是否相同
  7. UnrealEngine4-Roadmap
  8. oracle数据库主主复制
  9. 03-es6语法 Promise 和 es8语法 async await 的了解和基本使用
  10. vue+webpack实践
  11. jmeter的安装和测试
  12. SQLServer数据库备份与还原
  13. 2015年国民经济和社会发展统计公报
  14. 蓝湖及PS测量设计稿的使用
  15. ArcGIS根据矢量图层范围裁剪影像
  16. Windows11硬盘读写速度变慢的解决方法
  17. 南昌航空大学计算机控制实验,南昌航空大学关于实验教学的管理办法
  18. 【多线程】多线程到底是个甚——多线程初阶(复习自用)
  19. Fluent多组分设置及化学反应
  20. 扫一扫跳转到微信非官方网页提醒页面解决方案

热门文章

  1. 适合经管类学生学习的几个数据分析工具
  2. Ecshop打印报价单页面显示空白!
  3. 王立铭紧急发声:为什么基因编辑婴儿在今天不可原谅?
  4. 安科瑞ADW300系列三相电能表接线及modbus协议
  5. 【开发记录】利用QT读取Excel并写入数据
  6. MC9S12X系列MCU开发教程第0课:序言
  7. Linux基础(day53)
  8. 5G市场乱象:用户被擅自开通套餐,资费贵了网速没快
  9. 阿里资深架构师倾情力荐:Java全线成长宝典,P5到P8一应俱全
  10. 年轻人,别只想着追风口