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

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++编译器的函数编译流程的更多相关文章

  1. Gcc的编译流程分为了四个步骤:

    http://blog.csdn.net/xiaohouye/article/details/52084770(转) Gcc的编译流程分为了四个步骤: 1.预处理,生成预编译文件(.文件): Gcc ...

  2. C/C++程序编译流程(预处理->编译->汇编->链接)

    程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内 ...

  3. [uboot] (第四章)uboot流程——uboot编译流程

    http://blog.csdn.net/ooonebook/article/details/53000893 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  4. [uboot] (第二章)uboot流程——uboot-spl编译流程

    http://blog.csdn.net/ooonebook/article/details/52949584 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  5. GCC编译流程浅析

    GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙 ...

  6. GCC 编译流程简介

    GCC-GCC编译流程 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套 ...

  7. [uboot] (第四章)uboot流程——uboot编译流程 (转)

    以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(B ...

  8. [uboot] (第二章)uboot流程——uboot-spl编译流程(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...

  9. [Erlang 0113] Elixir 编译流程梳理

    注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效      之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...

随机推荐

  1. js和jQuery获取各种屏幕或文档的高度和宽度

    1.jQuery获取文档或屏幕的高度 console.log($(window).height());//浏览器页面当前屏幕可见区域的高度 console.log($(document).height ...

  2. ayer.prompt 怎样让输入值为空也可以向下执行

    http://fly.layui.com/jie/4227/ layer.prompt({title: '输入任何口令,并确认',formType: 1, //prompt风格,支持0-2value: ...

  3. MySQL---3、常用命令大全

    一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -ur ...

  4. php分页实例及其原理

    Part1:实例 /** * 取得上次的过滤条件 * @param string $param_str 参数字符串,由list函数的参数组成 * @return 如果有,返回array('filter ...

  5. Spring MVC 实现Excel的导入导出功能(2:Excel的导入优化和Excel的导出)

    Excel的导入V2优化版 有些时候文件上传这一步骤由前端来处理,只将上传后的 URL 传输给后端(可以参考上一文中的图片上传功能),也就是导入请求中并不会直接处理 MultipartFile 对象, ...

  6. 前端动画小记---bilibili ( ゜-゜)つロ客户下载小动画

    逛哔哩哔哩 ( ゜-゜)つロPC版的时候看到一个蛮有意思的动画,指导用户去下载客户端,于是摸索实现了一个. 原动画效果 可以看到,一个静止的小电视人,当鼠标移动到电视人身上时,电视人慢慢变身成为一个小 ...

  7. 转:Redis和Memcache的区别分析

    Redis和Memcache的区别分析  原文链接:http://blog.csdn.net/u013474436/article/details/48632665 简单区别: 1. Redis中,并 ...

  8. 为什么推荐用ui-router替代ngRoute

    初学angularjs,第一个实例是官网的phoneCat,里面路由用的是ngRoute,后来看到别的用ui-router,觉得好奇,ui-route是什么呢?百度一些,得到如下解释: ui-rout ...

  9. 前端面试题1(html)

    HTML     * Doctype作用?严格模式与混杂模式如何区分?它们有何意义? 1.<!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.此标 ...

  10. Nginx采用yum安装方式及安装后的目录

    第一次写博客就不讲究格式了,纯文字了吧 开始 第一步先执行 rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release- ...