定义c全局变量常量几种方法的区别

定义c全局变量常量几种方法的区别

ID:8828411

大小:36.50 KB

页数:4页

时间:2018-04-08

定义c全局变量常量几种方法的区别_第1页
定义c全局变量常量几种方法的区别_第2页
定义c全局变量常量几种方法的区别_第3页
定义c全局变量常量几种方法的区别_第4页
资源描述:

《定义c全局变量常量几种方法的区别》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、在讨论全局变量之前我们先要明白几个基本的概念:1.编译单元(模块):在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINKERROR),因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;

2、第二步,将工程中所有的obj文件进行LINK生成最终的.exe文件,那么错误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。我们所说的编译单元就是指在编译阶段生成的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程由很多个编译单元组成,每个obj文件里包含了变量存储的相对地址等。2.声明与定义的区别函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过,但是当函数或变量定义的时候,它就在内存中

3、有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解,对同一个变量或函数的声明可以有多次,而定义只能有一次!3.extern的作用extern有两个作用,第一个,当它与"C"一起连用时,如:extern"C"voidfun(inta,intb);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_i

4、nt#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!当extern不与"C"在一起修饰变量或函数时,如在头文件中:externintg_Int;它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽

5、然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。如果你对以上几个概念已经非常明白的话,那么让我们一起来看以下几种全局变量/常量的使用区别:1.用extern修饰的全局变量以上已经说了extern的作用,下面我们来举个例子,如:在test1.h中有下列声明:#ifndefTEST1H#defineTEST1Hexterncharg_str[];//声明全局变量g_strvoidfun1();#endif在test1.cpp中#include"test1.h"charg_str[]="123456";//定义全局变量

6、g_strvoidfun1(){cout<

7、obj这个编译单元不需要再有一份了,不然会在连接时报告重复定义这个错误!有些人喜欢把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如把上面test1.h改为externcharg_str[]="123456";//这个时候相当于没有extern然后把test1.cpp中的g_str的定义去掉,这个时候再编译连接test1和test2两个模块时,会报连接错误,这是因为你把全局变量g_str的定义放在了头文件之后,test1.cpp这个模块包含了test1.h所以定义了一次g_str,而test2.cpp也包含了test1.h所以再一次定义了g

8、_str,这个时候连接器在连接test1和test2时发现两个g_str。如果你非要把g_str的定义放在test1.h中

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。