最近用到ucos,这个RTOS本身是用C语言和部分汇编编写,而自己又打算用C++来写应用,在其中遇到几个问题,一番折腾之后,让我更加深刻认识到了在一些一般不注意的细节上,C与C++的不同。
    1、对于ucos,虽然我想Labrosse先生值得我们尊敬,为我们提供了ucos这么一个优秀的学习、应用RTOS的样本。但是我认为,Labrosse先生的C/C++语言功力还算不上炉火纯青。一个简单例子,在C中,右值无论是何种类型,皆可以强制转换为左值类型而不用强制说明(但最好自己声明转换)。ucos中大量的类型并没有手工声明转换类型,而恰恰C++中,这样是通不过编译的(除了基本类型转换)。这样,当我在工程中使用C++编译器来编译时,就会报告大量的类型转换出错。这个也许还算OK,自己一条一条加上就OK了。
    2、对于第二个问题,这与Labrosse先生无关了,不过我还是被折腾好半天。当我修改好上面的问题后,编译再次出错,这次问题提示说,系统调度的一些核心函数没有定义。这我可晕了半天,找了大半天问题,除了发现这些报告未定义的函数都是出自于一个ASM汇编写的函数之外,似乎其他头绪了。这时候,我想,会不会是C编译器生成的目标文件的函数名与C++编译器生成的目标文件的函数名不同,因为ucos的C代码中会调用到ASM中的函数。于是,我自己用提供的C和C++编译器,分别对两段相同的函数文件(只是后缀名不同,一个C一个CPP)进行编译。果然不出所料,的确不同。例如我们在C/CPP中命名一个函数,例如 OSTickISR(),在C编译器生成的ASM中,名称是 _OSTickISR;在C++编译器生成的ASM中,名称是@OSTickISR$qv。而原ASM文件都是用C编译器一样的格式来声明的,所以以前直接用C编译能够正确,而现在换C++编译器就出错。
    至此,我的代码终于能够顺利和修改后的ucos一起用C++编译器进行编译了。
    以前我们区别C与C++的不同,主要还是集中例如面向对象,STL,Template等技术至上,对于这些小细节了解很少。通过这次的问题,让我更加深刻认识到,C++与C,在除了面向对象的层次上,还存在大量的不同,C++ is not a better C。 
   (该规范适用于Borland C++所带的编译器和链接器)

转载于:https://www.cnblogs.com/leaway/archive/2006/04/27/386107.html

关于C生成的汇编与C++生成的汇编在函数名称上的差异相关推荐

  1. oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析

    SELECT TO_CHAR(SYSDATE,'YYMMDD')||LPAD(REFUNDSEQ.NEXTVAL,6,'0') AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 ...

  2. java 生成 防伪码,优秀的生成防伪码的代码应该如何写?百万千万量级别的。

    需求: 生成的防伪码长度大概在 12~18 位 有可能是纯数字,或者字母+数字 绝对不能重复 某 cms 防伪系统的生成防伪码的源码: function genRandomString($len, $ ...

  3. 对抗生成网络_深度卷积生成对抗网络

    本教程演示了如何使用深度卷积生成对抗网络(DCGAN)生成手写数字图片.该代码是使用 Keras Sequential API 与 tf.GradientTape 训练循环编写的. 什么是生成对抗网络 ...

  4. 【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )

    文章目录 I . 视图绑定组件简介 II . 视图绑定 ViewBinding 使用前提 ( Android Studio 3.6 ) III . 视图绑定组件启用 IV . 定制视图绑定 ( 启用视 ...

  5. Dataset:数据生成之利用pandas自定义生成随机各自类型(离散型和连续型)的dataframe数据

    Dataset:数据生成之利用pandas自定义生成随机各自类型(离散型和连续型)的dataframe数据 目录 数据生成之利用pandas自定义生成随机数据 输出结果 实现代码 数据生成之利用pan ...

  6. Python语言学习:Python随机生成那些事之随机生成使用方法、案例应用之详细攻略

    Python语言学习:利用Python随机生成那些事之随机生成使用方法.案例应用之详细攻略 目录 案例应用 1.随机生成指定区间内的某一值 案例应用 1.随机生成指定区间内的某一值 使用说明:给定区域 ...

  7. latex自动生成中文目录_自动生成工作表目录三种方法,看哪种适合你?

    如果在一个工作簿内有很多工作表需要去维护管理,一个个的查找显然是很麻烦的,建立一个工作表的导航目录无疑是最便捷的方法. 下面介绍三种生成工作表目录的方法: 一.利用宏表函数生成可导航目录 第1步:定义 ...

  8. java excel转word表格_java利用poi生成/读取excel表格、生成word

    1.引入jar包依赖 org.apache.poi poi 3.9 org.apache.poi poi-ooxml 3.8 View Code 2.编写代码测试 1 packagetestweb;2 ...

  9. Shell编程 ——for循环、if语句、sleep睡眠。——每秒钟生成一个文件,一共生成60个文件

    实践: 每秒钟生成一个文件,一共生成60个文件,文件名格式是"20190101_101010.txt".但是,第10.20秒,不生成文件. #!/bin/sh for((i=0;i ...

最新文章

  1. 零起点学算法03——超简单模仿算术题
  2. C#如何把List of Object转换成List of T具体类型
  3. [导入]《交互设计之路——让高科技产品回归人性》读书笔记(一)
  4. abstract类_【Java】类的结构 - Nemo
  5. Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct
  6. 32--数组中重复的数字
  7. 罗永浩宣布进军电商直播;微博回应用户数据泄露;Android 11 开发者预览版 2 发布 | 极客头条...
  8. 如何旋转Android模拟器显示? [重复]
  9. oracle windows 优化工具,使用某Windows优化大师对Windows2000操作系统进行了优化,优化完成之后,oracle数据库便无法正常工作...
  10. 信息学奥赛一本通1142:单词的长度
  11. Office 2016出现加载DLL失败或者库未注册的问题:0x8002801D或者0x80029C4A
  12. 崩坏3mmd中的渲染技术研究
  13. 1467 Radio Transmission
  14. 紫川歪传------------恶搞暴笑版
  15. 【已解决】如何设置、更换LaTeX Beamer的字体?以及调整正文所使用的字体(如从Times New Roman改变为Arial)、定义字体大小等操作
  16. 工业物联网创新方案亮相2018云栖大会
  17. 关于UEFI引导的理解
  18. CollaNote - 完全免费无广告的 iPad / iPhone 手写笔记应用(Notability / GoodNotes 的免费替代品)
  19. 国外大学诸多自学课程
  20. Oracle Flashback之Flashback table和flashback drop

热门文章

  1. jq之$(“tr:even“).css(“background-color“,“yellow“)
  2. 【C语言进阶】 宏定义实现字符串引用
  3. linux常见基础服务,常用的linux命令的基本使用(一)
  4. 用java输入学生姓名查询成绩_编写一个Java程序,提示用户输入学生数量,学生姓名和他们的成绩,并按照成绩的降序打印学生姓名...
  5. php首页遍历出商品详情页,ECSHOP首页/分类页/详情页各页面调用显示销量
  6. esim办理出现差错_经营二氧化碳如何办理危化证?快来看!
  7. redis 清空db下_PHP操作redis实现的分页列表
  8. linux docker权限,linux - 如何解决ubuntu中的docker权限问题? - Ubuntu问答
  9. php 选择 出现列表,php – 如何从加权列表中选择4个唯一项?
  10. mysql error 1594_【MySQL】解决mysql的 1594 错误-阿里云开发者社区