- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C第六章解析
第六章 名称空间 本章主要内容 1. 名称冲突 2. 内部连接与外部连接 3. 名称空间的定义和使用 §1 名称冲突 与标识符的作用范围相关:在同一个作用域内,不能有两个完全一样的标识符 工程中包含多个文件时,由于有些标识符的作用范围是可以扩展的,因此会造成标识符的名称冲突 团队开发中,不同模块由不同程序员完成,各人都有自己给标识符命名的习惯,不同模块中的标识符之间可能存在名字上的冲突 例:变量名的冲突 //main.cpp extern int nTestVar; void main() { nTestVar = 0; } //defvar.cpp int nTestVar; //another.cpp int nTestVar; 连接时无法确定是哪一个文件中定义的变量nTestVar 同一工程中的文件 例:函数名的冲突 void funcTest(); void main() { funcTest(); } //defvar.cpp void funcTest() { } //another.cpp void funcTest() { } 同一工程中的文件 连接时无法确定是哪一个文件中定义的函数funcTest(); 待开发的系统越大,名字的冲突越严重 一旦发生名字的冲突,会造成对源代码的大量修改,增大了开发工作量,且在修改过程中可能引入新的错误 在团队开发中,这种情况尤其严重 函数重复定义 §2 内部连接与外部连接 源程序必须翻译成二进制的机器代码,才能被执行 C++的翻译采用编译+连接的方式,即工程中所有源程序文件(.CPP文件)经过编译程序的处理,得到相应的目标程序文件(.obj或.o文件),连接程序再把这些目标程序文件与系统提供的库函数、类等进行连接(组装),得到可执行的程序 根据标识符的属性不同,连接方式有两种 .内部连接 .外部连接 连接程序的任务之一是建立标识符与内存地址之间的对应关系,即确定标识符代表的变量或函数等在内存中的位置 外部连接 作用域为文件范围的标识符,连接程序处理工程中的任何一个文件时,该标识符对于连接程序都是可见的,称这种标识符具有外部连接属性 全局变量和全局函数都具有外部连接属性 具有外部连接属性的标识符可能会造成名称冲突 内部连接 静态函数、全局静态变量对应的标识符,只在定义该标识符的文件中起作用,连接程序处理工程中其它文件时,该标识符对连接程序是不可见的,称这种标识符具有内部连接属性 具有内部连接属性的标识符不会与其它文件、模块中标识符的名称发生冲突 局部变量对应的标识符只在定义它的函数中起作用,不会与其它标识符发生冲突,所以一般不讨论其连接属性 例:外部连接与内部连接 //fTest1.cpp int nConflict; static int nNoConflict; void funcConflict(){ } static void funcNoConflict(){ } //fTest2.cpp int nConflict; static int nNoConflict; void funcConflict(){ } static void funcNoConflict(){ } //main.cpp extern int nConflict; extern int nNoConflict; void funcConflict(); void funcNoConflict(); void main(){ nConflict = 1; nNoConflict = 2; //错 funcConflict(); funcNoConflict(); /*错*/} 冲突:外部连接 不冲突:内部连接 §3 名称空间(namespace) 名称空间在C++中是为了对全局标识符的名称进行灵活、高效的管理和使用而引入的概念 把一个全局的名称空间分成多个小空间,每个全局标识符对应的名称都属于其中某个名称空间,不同名称空间中的标识符可以同名,但因所在空间不同(作用范围不同)而不会发生冲突,从而解决了名称冲突的问题 名称空间的创建:与创建一个类相似 例:namespace MyLib{ class X{ }; void funcTest(){ } } 说明: 定义namespace的}后不加分号; 名称空间内部可以包含类、普通函数、全局变量等全局标识符的定义或声明,也可以包含名称空间的嵌套定义 namespace只能在全局范围内定义 名称空间是开放的,一个namespace可以在多个头文件中用同一个标识符定义,该名称空间是这多个定义的并集 名称空间不是数据类型,不能定义名称空间的变量
文档评论(0)