关于C生成的汇编与C++生成的汇编在函数名称上的差异
2006-04-27 00:09
357 查看
最近用到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++所带的编译器和链接器)
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++所带的编译器和链接器)
相关文章推荐
- C/C++拾遗录--关于宏定义汇编函数的的做法
- 关于 C++空类时编译器自动生成函数 总结
- 关于VC中生成的PE(exe, dll, sys...)文件中对函数名称的修饰
- Name Mangling in C++(g++生成链接库后函数名称的变化)
- 关于C++一些常用函数的说明(scanf,fabs,abs)
- 关于C++中输入函数cin的一些总结
- [c++ primer plus]c++ compiler缺省生成了哪些构造函数?关于构造函数的注意事项。
- C/C++中关于时间的函数 ctime()
- 一小段C++程序,关于ltoa函数的
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- C++ 输出代码所在的文件、行数以及函数名称
- 关于程序集生成失败 -- 引用的程序集没有强名称的解决办法
- 关于C++里面使用set_union,set_intersection等函数的使用总结
- C++自动生成16进制数并且用 sprintf函数输出大写8位16进制数
- 关于C++随机生成中文字符
- C/C++实现的游戏角色名称名字随机生成代码
- C/C++中关于函数调用结束后变量释放的问题
- 关于c++中函数的返回值
- 关于 C++ 函数返回局部变量的警告