1.控制变量定义作用域的因素有哪些?
2.auto,register,static,exturn类型变量的特点与用法是什么?
问题背景:
首先了解编译原理:
0.0其中#program once 能保证被包含的头文件之被编译一次;相互包含的文件需要使用#program once来让编译过的文件被跳过。
0.1编译原理是由类的.h文件和对应的.cpp文件先单独生成.obj目标文件。再由.obj文件联合起来检查生成.exe可运行文件。
0.2在.obj文件链接的时候:定义在.h头文件中的全局变量 可以直接调用,定义在.cpp文件中的变量不能直接调用(可以通过返回类型函数间接调用)
定义在.h文件中的全局变量必须使用static,不然会出现已定义。
#include"Exp2.h" static int A = 1; //-----------------Exp1.h文件(包含Exp2.h)------------------------- #include"Exp1.h" static int B = 2; //-----------------Exp2.h文件(包含Exp1.h)------------------------- void Exp1_Fun() { int C = A + B; //定义在.h文件中的全局变量能直接调用。 } //--------------------Exp1.cpp文件-------------------------
图1
相互包含,定义在.h文件中的全局变量能相互调用
#include"Exp1.h" int B = 2; int* Exp1_Return_B_Fun() { return &B; } //-----------------------Exp2.cpp------------------------- #include"Exp2.h" int A = 1; void Exp1_Error_Fun() { int C = A + B; //error:不能直接调用 } void Exp2_Right_Fun() { int C = A + *Exp1_Return_B_Fun();//Right:.cpp之间能通过函数调用 } //-----------------------Exp1.cpp--------------------------
图2
.cpp文件之间能通过函数间接调用,不能直接调用。
0.3.h及其.cpp文件编译独自编译生成的.obj文件在一起编译的时候,有.h文件相关联的.obj文件中出现了相同名称的文件,如果没有用exturn区分的变量就会被视为是重复定义。
0.4因为相关类之间定义在.h头文件的全局变量可以直接调用,所以就不需要再相关的头文件中定义exturn来申明是公用了。(也就意味着相关联的.h头文件之间不能定义任何相同名称的全局变量。);如图1所示。
0.5但是在.cpp文件中文件是不能直接调用的(因为.cpp中的全局变量不属于.h,所以不相关联)。并且,无论相不相关联的.h文件的.cpp文件如果有相同的名称的变量,会在.obj中出错。
解决办法:
一:想要通用
方法1.只在一个地方定义,另一个地方使用返回变量对象函数,返回到另一个.cpp文件中(这个方法非常麻烦);如图2所示。
方法2:采用exturn来在另一个.cpp文件中再次定义这个同名变量。编译器会自动去相关的.h文件中找相关的变量
不用为他申请内存,地址公用不会冲突,也就不会出现.obj冲突问题(这个方法最简单)
#include"Exp2.h" int A = 2; //----------------------Exp1.cpp----------------------- #include"Exp1.h" exturn int A; //此处定义的A不能赋初值,因为根本就没有为其申请内存,是用的另外文件的地址,如果在初始位置赋值,会产生访问内存冲突 //----------------------Exp2.cpp-----------------------
图3
两个.cpp文件之间能通过exturn公用变量。与.h中定义公用全局变量相同。
二:想要独立使用
在各个.cpp中使用static,变为私有变量。两个量不相关。
#include"Exp2.h" static A = 2; //----------------------Exp1.cpp----------------------- #include"Exp1.h" static A = 999; //两个.cpp文件中使用static命名的变量不冲突,为私有变量,分别独立分配内存 //----------------------Exp2.cpp-----------------------
图4
两个.cpp文件中使用static命名的变量不冲突,为私有变量,分别独立分配内存。
问题解决:1.auto定义变量,能够根据变量的具体数值改变为相应的类型。
auto不能作为函数的参数,不能作为全局变量(基本没用)
register可以作为函数的参数
2.register变量:
2.1只能作为局部变量不能作为全局变量。
2.2register是寄存在cup中的变量,会提高运行速度
2.3运用例子:大量循环使用的量使用此类型的量:
游戏中的地图碰撞判定:每帧都在不断循环判定对象是否和实体碰撞。
但是游戏中地图判定的值来自于全局变量啊,全局变量不能定义为register
而且类中不能使用register,自能用在单个大量计算?
还有办法就是先把值赋值给定义在函数中的register然后再进行 *** 作
3.static:
3.1全局变量定义再.h文件中必须声明为static不然会出错:报错显示:在Exp.h中定义,在main.cpp中调用定义;发生冲突
3.2在不同的.cpp文件中定义相同的名称必须使用static区分
3.3文件.h之间相互链接,所以用不用static在两个不同的.h文件中只要重名都会出错
4.exturn:
4.1exturn表示公用的意思,特别注意,这里exturn的原理是申明这个变量已经在之前定义过了,
让编译器去其他文件中找已经定义这个变量的位置。
不会再为其分配内存,自然也不会再在.obj文件中出错。
所以,必须在定义这个变量的地方赋初值,不能在exturn的地方赋初值,会在内存上出错
4.2定义第一个变量时候不能定义为static类型,因为相当于变成私有变量了,编译器会自动跳过这个变量。
从而因为找不到这个变量导致出错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)