写两个怪物移动函数重载与重写的区别的重载,函数重载与重写的区别一为不需要参数的,怪物自动移动,函数重载与重写的区别二参数为目标位置的追踪移动

C/C++(3)
1.http://blog.csdn.net/hxg/article/details/6632954
2..cn/wp-content/uploads/2013/02/effective-c.pdf
1.问题定义
extern “C” 的作用是让 C++ 程序能够成功链接由
C 编译器编译生成的库文件或者是目标文件。
通常,在C&语言的头文件中经常可以看到类似下面这种形式的代码:
& & & 其实extern “C”可以用在函数定义之前,也可以用在函数声明之前。这两者的区别在后续内容中将会讲到,但是一般用在函数声明之前。或许大家都知道,extern “C”的作用就是在C++环境中使函数按照C的标准来编译和链接,但这种说话不全面。比如说当extern “C”放在函数声明之前,就不会改变函数的编译方式,只是指定编译器按照C的标准链接,而不是按照C++的标准去链接函数。
& & & &在C++编译器里,有一位暗黑破坏神,专门从事一份称作“名字粉碎”(name mangling)的工作。当把一个C++的源文件投入编译的时候,它就开始工作,把每一个它在源文件里看到的外部可见的名字粉碎的面目全非,然后存储到二进制目标文件的符号表里。
& & & 之所以在C++的世界里存在这样一个怪物,是因为C++允许对一个名字给予不同的定义,只要在语义上没有二义性就好。比如,你可以让两个函数是同名的,只要它们的参数列表不同即可,这就是函数重载(function overloading);甚至,你可以让两个函数的原型声明是完全相同的,只要它们所处的名字空间(namespace)不一样即可。事实上,当处于不同的名字空间时,所有的名字都是可以重复的,无论是函数名,变量名,还是类型名。
& & & &另外,C++程序的构造方式仍然继承了C语言的传统:编译器把每一个通过命令行指定的源代码文件看做一个独立的编译单元,生成目标文件;然后,链接器通过查找这些目标文件的符号表将它们链接在一起生成可执行程序。
& & & &编译和链接是两个阶段的事情;事实上,编译器和链接器是两个完全独立的工具。编译器可以通过语义分析知道那些同名的符号之间的差别;而链接器却只能通过目标文件符号表中保存的名字来识别对象。
& & & &所以,编译器进行名字粉碎的目的是为了让链接器在工作的时候不陷入困惑,将所有名字重新编码,生成全局唯一,不重复的新名字,让链接器能够准确识别每个名字所对应的对象。但C语言却是一门单一名字空间的语言,也不允许函数重载,也就是说,在一个编译和链接的范围之内,C语言不允许存在同名对象。比如,在一个编译单元内部,不允许存在同名的函数,无论这个函数是否用static修饰;在一个可执行程序对应的所有目标文件里,不允许存在同名对象,无论它代表一个全局变量,还是一个函数。所以,C语言编译器不需要对任何名字进行复杂的处理(或者仅仅对名字进行简单一致的修饰(decoration),比如在名字前面统一的加上单下划线_)。
3.1&VC中.c与.cpp的编译规则
问题:在C++编译环境(VC 6.0)中,工程文件中同时包含.c文件和.cpp文件,那么编译.c和.cpp按照什么编译规则来编译的,有什么区别?
解答:在VC 6.0工程文件中,可能含有.cpp文件和.c文件混合编译。在.c的源文件按照C的标准来编译,函数名之前加入”_”,并把“_函数名”放入到符号表中,以后链接时使用。.cpp的源文件按照C++的标准编译,会修改函数名,这个不同的编译器有不同的实现方式,在VC中,函数名被修改的有些乱,如下:
(新建一个控制台工程包含func.c和main.cpp两个文件,func.c中定义了void func()在main.cpp中调用)
会提示链接错误!
func.c的汇编代码
有上述汇编代码可见,func函数编译后,函数名为_func(), 可见.c文件在VC中采用的是标准C的编译方式。
main.cpp的汇编代码
而在main.cpp中func的函数吗编译成?func@@YAXXZ
所以在链接时会出现错误!(main.cpp编译后的调用函数名和func.c编译后的函数名对不上)
怎么解决这个问题呢?
很简单只需要在main.cpp中把函数声明改为void
再次编译,链接通过
现在再查看汇编代码
func.c的汇编代码不变,因为没有任何改动,而main.cpp的汇编代码如下:
可以看到func()名字编译成了_func和func.c中的名字一致了,所以不会有错误了
3.2 & extern “C”放在函数声明前的作用
问题:在C++编译环境中,用了(extern “C”+函数声明)与(不用extern “C”+函数声明),区别在哪?
解答:用(extern “C”+函数声明),表明CPP此文件中的函数名称,以C的标准来改编(“_函数名”), 如果在CPP文件中函数声明前不用extern “C”,则采用C++的标准来改编。
3.3 & extern “C”放在函数定义前的作用
问题:在cpp文件中在函数定义前加了extern “C”后,此的函数定义的编译方式是否会改变(按照c的编译方式编译还是按照c++的编译方式编译)?
解答: 会改变,如果extern “C”放在函数定义之前,则C++编译器使得函数按照C的标准来编译和链接函数。
3.4 &关于C标准库函数的思考
C和C++都支持C标准库函数,那么.c和.cpp中对标准库函数调用时他们的函数名改编是怎么样的呢?
在上述工程里func.c和main.cpp里都调用了C的标准库函数printf
func.c的汇编代码和main.cpp汇编代码如下
func.c的汇编代码:
main.cpp的汇编代码:
可以发现printf名字都改编成了_printf,原因?
打开stdio.h可以发现
头文件有如下宏定义
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4826次
排名:千里之外
(1)(6)(5)(2)(1)(1)【图文】C++ 8多态与虚函数_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
C++ 8多态与虚函数
大小:4.56MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
&正在加载...
请选择打赏金额:
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
30秒后自动关闭
兄弟连iOS学习入门C语言基础(二) 函数 2 函数的嵌套调用">兄弟连iOS学习入门C语言基础(二) 函数 2 函数的嵌套调用
播放量数据:快去看看谁在和你一起看视频吧~
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制}

我要回帖

更多关于 c 函数重载 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信