欢迎来到天天文库
浏览记录
ID:12065888
大小:31.00 KB
页数:5页
时间:2018-07-15
《如何定义全局变量》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、定义C/C++全局变量/常量几种方法的区别(转)C/C++技术2009-10-0520:26:45阅读293评论0字号:大中小在讨论全局变量之前我们先要明白几个基本的概念:1.编译单元(模块):在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINKERROR),因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译
2、与连接的区别!当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,VC其实做了两步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;第二步,将工程中所有的obj文件进行LINK生成最终的.exe文件,那么错误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。我们所说的编译单元就是指在编译阶段生成的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程
3、由很多个编译单元组成,每个obj文件里包含了变量存储的相对地址等。2.声明与定义的区别函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过,但是当函数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解,对同一个变量或函数的声明可以有多次,而定义只能有一次!3.extern的作用extern有两个作用,第一个,当它与"
4、C"一起连用时,如:extern"C"voidfun(inta,intb);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!当extern不与"C"在一起修饰变量或函数时,如
5、在头文件中:externintg_Int;它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。如果你对以上几个概念已经非常明白的话,那么让我们一起来看以下几种全局变量/常量的使用区别:1.用extern修饰的全局变量以上已经说了
6、extern的作用,下面我们来举个例子,如:在test1.h中有下列声明:#ifndefTEST1H#defineTEST1Hexterncharg_str[];//声明全局变量g_strvoidfun1();#endif在test1.cpp中#include"test1.h"charg_str[]="123456";//定义全局变量g_strvoidfun1(){cout<7、件中引用就可以了#include"test1.h"voidfun2(){cout<8、义,如把上面test1.h改为externcharg_str[]="123456";//这个时候相当于没有extern然后把test1.cpp中的g_str的定义去掉,这个时候再编译连接test1和test2两个模块时,会报连接错误,这是因为你把全局变量g_str的定义放在了头文件之后,test1.cpp这个模块包含了test1.h所以定义了一次g_str,而test2.cpp也包含了test1.h所以再一次定义
7、件中引用就可以了#include"test1.h"voidfun2(){cout<8、义,如把上面test1.h改为externcharg_str[]="123456";//这个时候相当于没有extern然后把test1.cpp中的g_str的定义去掉,这个时候再编译连接test1和test2两个模块时,会报连接错误,这是因为你把全局变量g_str的定义放在了头文件之后,test1.cpp这个模块包含了test1.h所以定义了一次g_str,而test2.cpp也包含了test1.h所以再一次定义
8、义,如把上面test1.h改为externcharg_str[]="123456";//这个时候相当于没有extern然后把test1.cpp中的g_str的定义去掉,这个时候再编译连接test1和test2两个模块时,会报连接错误,这是因为你把全局变量g_str的定义放在了头文件之后,test1.cpp这个模块包含了test1.h所以定义了一次g_str,而test2.cpp也包含了test1.h所以再一次定义
此文档下载收益归作者所有