C语言复习:(六)变量定义作用域

C语言复习:(六)变量定义作用域,第1张

C语言复习:(六)变量定义作用域 问题:

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类型,因为相当于变成私有变量了,编译器会自动跳过这个变量。
        从而因为找不到这个变量导致出错。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5432723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存