C++编译器的函数编译流程

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).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个包主要实现了最简单的Lex和Yacc环境,包含了最少的但是必须的文件。<br>同时还包含了一个MinGW的GNU的C++编译器环境:)可以直接使用:)<br><br>这个包包含的文件列表:<br><br>MinGW GNU的C/C++编译程序(windows版本)<br>bison.exe GNU的yacc程序<br>bison.hairy GNU的yacc程序运行需要的文件<br>bison.simple GNU的yacc程序运行需要的文件<br>flex.exe GNU的lex程序<br>ini.bat 这个lex和yacc环境的环境变量配置<br>lexyacc.bat 这个lex和yacc环境的启动程序<br>Readme.txt 本说明文件<br><br>使用方法:<br><br>1. 鼠标双击lexyacc.bat文件运行<br>2. 在弹出的DOS命令行中利用CD切换到你的lex和yacc源文件所在的目录(calc)<br>3. 对lex源文件执行flex calc.l<br>4. 对yacc源文件执行bison -d calc.y<br><br>经过上面的四个步骤就生成了你需要的C/C++源文件,剩下的事情就是编译<br>这里生成的C/C++源程序了。<br><br>5. g++ lex.yy.c calc.tab.c -o calc<br><br>最后谢谢您的使用,也希望您提出宝贵的意见或者建议,我会认真考虑您的<br>意见或者建议的。可以发邮件到[email protected]和我联系。<br><br>博客:http://blog.csdn.net/pandaxcl<br>论坛:http://www.autodev.net<br><br><br>大家好,本人历时两年构思了四年,目前完成了一半的自动化C++程序设计代码库<br>(autocxx)总算可以拿出来见人了,大家多到论坛(http: //www.autodev.net)<br>或者博客(http://blog.csdn.net/pandaxcl)提些意见吧:)代码是开源的;)<br>下面是整个项目的文档目录:<br><br> * 自动化C++程序设计<br> * 基础篇<br> * C++里的模板语言<br> * 静态诊断<br> * 为什么说模版是C++的子语言<br> * 静态数学运算<br> * 静态选择结构<br> * 静态循环结构<br> * 运算结果的保存<br> * 基本类型<br> * nil类型<br> * t类型<br> * any类型<br> * text类型<br> * kind类型<br> * 类型串类型p<br> * 将C++的模版语言规范化<br> * is_same元函数<br> * 选择结构select<br> * partition元函数<br> * 类型串生成元函数mkps<br> * length元函数<br> * capacity元函数<br> * at元函数<br> * range元函数<br> * 静态循环(loop)<br> * 针对PS的静态循环(loop_ps)<br> * 自动生成函数调用(eloop)<br> * 针对PS自动生成函数调用(eloop_ps)<br> * p的其它一些重要的辅助函数<br> * join元函数<br> * cut元函数<br> * count元函数<br> * index元函数<br> * exist元函数<br> * repeat元函数<br> * resize元函数<br> * reverse元函数<br> * replace元函数<br> * unique元函数<br> * filter元函数<br> * map元函数<br> * reduce元函数<br> * 自动生成C++类<br> * scatter类<br> * tuple结构<br> * 分析C++类层次<br> * 分析C++类结构<br> * 类是否拥有指定参数的成员函数<br> * 类是否存在指定名称的成员函数<br> * 类是否存在指定名称的成员变量<br> * 类是否存在指定名称的子类(型)<br> * 分析C++重载函数<br> * 分析函数参数的数量<br> * 分析函数参数的种类<br> * 存在的问题<br> * C++自动化<br> * 应用篇<br> * C++静态计算器<br> * 顺序计算器<br> * 带括号顺序计算器<br> * 加减乘除带括号计算器<br> * 前缀表达式静态计算器<br> * lambda演算<br> * 基本LISP解释器<br> * 基本静态LISP解释器<br> * 扩展静态LISP解释器<br> * 静态语言解释器的生成器<br> * 问题陈述<br> * 词法分析器<br> * 语法规则表述<br> * 语法规则响应器<br> * 语法分析实现<br> * 使用前面的LEX和YACC实现静态数据库(SQL)语言<br> * 观察者模式的C++自动化实现<br> * 什么是观察者模式<br> * 观察者模式普通实现<br> * 观察者模式中的必备元素<br> * 将观察者模式普通实现自动化<br> * 将观察者模式标准化<br> * 一个使用自动化观察者模式的复杂例子<br> * 撤销和重做(Undo/Redo)的C++自动化实现<br> * 交换函数swap功能的讨论<br> * 撤销和重做原理<br> * 撤销和重做的基本架构<br> * 将撤销和重做的基本架构模组化<br> * 处理多类型的对象以及命令管理<br> * 扩展的框架代码<br> * 处理复合对象<br> * 自动化的用户界面(UI)<br> * 高级篇<br> * 应用BOOST的MPL库<br> * 采用OO思想进行框架设计<br> * 文本编辑器<br> * 图形用户界面<br> * 游戏引擎架构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值