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

    最近用到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++编译器就出错。另外解释一下@OSTickISR$qv中的$qv表示,只有一个参数,是void型。类似,如果是Max(int a, int b)这种函数,C++编译为@Max$qii,i表示整型。
    至此,我的代码终于能够顺利和修改后的ucos一起用C++编译器进行编译了。
    以前我们区别C与C++的不同,主要还是集中例如面向对象,STL,Template等技术至上,对于这些小细节了解很少。通过这次的问题,让我更加深刻认识到,C++与C,在除了面向对象的层次上,还存在大量的不同,C++ is not a better C。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值