C 编译器的函数编译流程
创始人
2024-07-16 08:00:20
0

C++中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍。

对于 .cpp 文件中调用的一个函数 ( 或成员函数 ), 编译器主要做了下面三件事情 :

1 名字查找 . 先在所在编译单元中可见名字实体中进行名字查找 .

(1) 类成员函数优先 ( 对象所在的类 -> 基类 ). 一经找到就停止查找 .

(2 )如果没有 ,在相应的名字空间中做进一步的搜索 ;

(3) 如果还没有 , 会根据函数参数所在的名字空间中查找 (keoning 查找 ).

2 重载决议 . 根据所找到的名字进行重载决议 , 根据参数最匹配原则选择相应的函数 .

3 可访问性检查 . 用以确定被选中的函数是否可被调用 .

说明 :

1) 根据***条 , 显然 , 如果类型想和非成员函数一起工作 , 那么它们应该放在同一个名字空间中 . 比如 , 一般类型的重载运算符和参数类型放在同一个头文件中/或者同一个名字空间下 .

2) 函数特化模板不参与重载决议 , 因此 , 如果想运用某个函数的特化 , ***的方法是重载该函数 , 在实现中采用该特化来工作 .

3) 重载决议发生在可访问性检查之前 . 因此 , 如果私有函数不幸参与了重载 , 并且被选中 , 最终也会出现无法访问的编译提示 . 这常常隐含二义性 , 这样的设计本身也不合理 . 换句话说 , 私有参数 , 在名字查找和重载时并非是 ” 私有的 ”.

以 c.Twice( 21 )的函数调用为例:

a) 名字查找:编译器会首先寻找一个至少包含一个名字为 Twice 的实体作用域(类,文件,或者名字空间),并将候选函数放入候选实体列表。例子中,编译器首先从对象 c 所在类实体中进行查找,找到就停止;如果没找到就会依次在其基类和外围的名字空间中查找,直到找到一个至少含有一个候选函数的作用域。两点需要注意: 1) 只要找到一个实体就停止查找,所以并非所有的同名函数都会被考虑; 2) 参数所在名字空间也属于查找范围(keoning 准则) 。

b) 重载决议:从所找到的候选重载函数列表中选出唯一***匹配 。如不唯一,就存在二义性。注意: 1) 这是基于名字查找结果的; 2) 特化的模板函数不参与重载。

c) 可访问性检查:确定所选出的函数是否可访问。这是***一步,晚于重载决议。

文章中的规则非常重要,理解后,很多C++的编译问题就自然解决了。后面将会有进一步的文章来介绍:如何确定C++每个编译单元(CPP文件)中的可见名字(与名字查找相关);Keoning查找详解; 重载 (Overload) 和虚函数的重实现 (override).

原文标题:揭秘:C++编译器的函数编译流程

链接:http://www.cnblogs.com/zhenjing/archive/2010/10/20/1856309.html

【编辑推荐】

  1. 简介学习C++总结之谈
  2. C++库函数进行学习探索总结笔记
  3. C++类库设计的基本构思与方法
  4. C++语言真的还有市场价值?
  5. C++类库设计的基本构思与方法

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...