唐山网站建设

设为主页 加入收藏 繁體中文

揭秘:C++编译器的函数编译流程

核心提示:C++中的类型查找进程相对简单,基本上就是名字查找,这里不再先容。对 .cpp 文件中调用的1个函数 ( 或成员函数 ), 编译器主要做了下面3件事情...

C++中的类型查找进程相对简单,基本上就是名字查找,这里不再先容。对 .cpp 文件中调用的1个函数 ( 或成员函数 ), 编译器主要做了下面3件事情 :

1 、名字查找 。

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

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

(2 )假设没有 ,在相应的名字空间中做进1步的搜索 ; (3) 假设还没有 , 会根据函数参数所在的名字空间中查找 (keoning 查找 )。

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

3、可访问性检查 。 用以肯定被选中的函数是否是可被调用 。

说明 :

1) 根据第1条 , 明显 , 假设类型想和非成员函数1起工作 , 那末它们应当放在同1个名字空间中 。 比如 , 1般类型的重载运算符和参数类型放在同1个头文件中/或同1个名字空间下 。

2) 函数特化模板不参与重载决议 , 因此 , 假设想应用某个函数的特化 , 最好的方法是重载该函数 , 在实现中采取该特化来工作 。

3) 重载决议产生在可访问性检查之前 。 因此 , 假设私有函数不幸参与了重载 , 并且被选中 , 终极也会出现没法访问的编译提示 。 这常常隐含2义性 , 这样的设计本身也不公道 。 换句话说 , 私有参数 , 在名字查找和重载时并非是 ” 私有的 ”。

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

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

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

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

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

原文地址:http://www.cnblogs.com/zhenjing/archive/2010/10/20/1856309.html

唐山网站建设www.fw8.net


TAG:函数,名字,编译器,特化,决议
评论加载中...
内容:
评论者: 验证码: