- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
全局变量externstaticconst区别与联系.doc
全局变量、extern/static/const区别与联系
在讨论全局变量之前我们先要明白几个基本的概念:
1. 编译单元(模块):??? 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌 入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两 步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;第二步,将工程中所有的obj文件进行LINK生成最终的.exe文件,那么错 误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。我们所说的编译单元就是指在编译阶段生成 的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程由很多个编译单元组 成,每个obj文件里包含了变量存储的相对地址等 。
2. 声明与定义的区别????函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过,?但是当函数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话, 那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解, 对同一个变量或函数的声明可以有多次,而定义只能有一次!
3. extern的作用(见我的另外一篇文章总结)??? extern有两个作用,第一个,当它与C一起连用时,如: extern C void fun(int a, int b); 则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的, C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的脾气了 (不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可 以得到满意的解释!????当extern不与C在一起修饰变量或函数时,如在头文件中: extern int g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或者其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译 单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可, 在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。
??? 如果你对以上几个概念已经非常明白的话,那么让我们一起来看以下几种全局变量/常量的使用区别:
1. 用extern修饰的全局变量??? 以上已经说了extern的作用,下面我们来举个例子,如:???? 在test1.h中有下列声明:??? #ifndef TEST1H??? #define TEST1H?? extern char g_str[]; // 声明全局变量g_str??? void fun1();??? #endif??? 在test1.cpp中??? #include test1.h??????? char g_str[] = 123456; // 定义全局变量g_str??????? void fun1()??? {??????? cout g_str endl;??? }??????? 以上是test1模块, 它的编译和连接都可以通过,如果我们还有test2模块也想使用g_str,只需要在原文件中引用就可以了??? #include test1.h
??? void fun2()??? {??????? cout g_str endl;??? }??? 以上test1和test2可以同时编译连接通过,如果你感兴趣的话可以用ultraEdit打开test1.obj,你可以在里面着123456这 个字符串,但是你却不能在test2.obj里面找到,这是因为g_str是整个工程的全局变量,在内存中只存在一份, test2.obj这个编译单元不需要再有一份了,不然会在连接时报告重复定义这个错误!??? 有些人喜欢把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如把上面test1.h改为????extern ch
您可能关注的文档
最近下载
- 六年级语文上册生字表识字表《写字表》字帖人教版同步字帖描红2.pdf VIP
- 第8课 用制度体系保证人民当家作主 教案 -2023-2024学年中职高教版(2023)中国特色社会主义.docx VIP
- 高二数学(含创意快闪特效)-【开学第一课】2023年高中秋季开学指南之爱上数学课.pptx VIP
- 第8课 用制度体系保证人民当家作主中职专用【2023年秋最新版】.pptx VIP
- 2025年秋新北师大版数学2年级上册全册同步教学设计.pdf
- 某热电厂1×300MW供热机组工程安全预评价报告.doc VIP
- 四年级语文上册《写字表》字帖.pdf VIP
- 地埋管计算方法.doc VIP
- 太极拳理论教学课件.pptx VIP
- 八年级上册语文学习笔记.pptx VIP
文档评论(0)