变量的存储类别、内外部函数【static\extern】

本文详细介绍了C++中四种变量存储类别:自动变量(auto)、静态局部变量(static)、寄存器变量(register)及外部变量(extern)的特点和使用场景,并区分了内部函数与外部函数的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量的存储类别

存储方法分为静态存储和动态存储两大类。具体包含4种:自动的、静态的、寄存器的、外部的。


一、自动变量auto

动态存储区,动态存储方式【局部变量+函数形参缺省时即时auto】


二、用static声明静态局部变量

1.函数中的局部变量的值在函数调用结束后不消失而保留原值,即占用的存储单元不释放。(常考:求该代码的运行结果)

2.存在静态存储区。

3.静态局部变量赋初值是在编译时进行的,即只赋初值一次,以后每次调用函数时不再重新赋初值只是保留上次调用结束时的值;定义静态局部变量不赋初值的话,编译时自动赋0(数值类变量)或空字符(字符型变量)【自动变量不赋初值的话,其是一个不固定的随机值。】

4.虽然其在函数调用后仍然存在,但其它函数不能引用它,即对其他函数不可见。


三、用register声明寄存器变量

        一般,变量存在内存中。当程序需要用到哪个变量的值时,控制器发出指令将内存中该变量的值送到CPU中的运算器。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。

为提高执行效率,C++允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,对寄存器的存取速度远大于对内存的存取速度,因此这样做可以提高执行效率。

当今的优化编译系统能识别使用频繁的变量,从而自动地将这些变量放在寄存器中,因此实际上用register声明是不必要的。

 

四、用extern声明外部变量

存在静态存储区。

1.  在一个文件内声明全局变量

即引用/使用在定义之前,故用extern关键字作提前引用声明,以扩展其作用域。

2.  在多文件的程序中声明外部变量

若一个程序包含两个文件,两个文件中都要用到同一个外部变量num,不能分别在两个文件中分别定义一个外部变量,否则在进行程序的连接时出现“重复定义”的错误。

file1.cpp
extern int a.b;
int main(){
……
}


flie2.cpp
int a = 3, b = 4;

正确的做法:在任一个文件中定义外部变量num,在另一个文件中用extern对num作外部变量声明:extern int num;

编译系统现在本文件中找有无外部变量num,若有,则将其作用域扩展到本行开始(如1所述);若无,则在程序连接时从其他文件中找有无外部变量num,若有,则把在另一个文件中定义的外部变量num的作用域扩展到本文件,使本文件可以合法引用该外部变量num。

注:执行一个文件中的函数时,可能会改变了该全局变量的值,从而影响到另一个文件中的函数执行结果。


五、用static声明静态外部变量

让某些外部变量只限于被本文件引用,不能【或者说防止~】被其他文件引用。

如:

file1.cpp
static int a = 3;
int main(){
……
}



file2.cpp
extern int a;
int func(){
    a++;
}
file1中这种加上static声明的只能用于本文件的变量称为静态外部变量。

虽然file2用了extern int a;,但是仍无法使用file1中的a。

在程序设计中,常有若干人分别完成各个模块,各人就可以独立在各自文件中使用而互不相干。更可以对本文件中所有全局变量都加上static,以免被其他文件误用。




注意:

1、全局变量包括:静态外部变量、外部变量(即非静态的)

2、静态存储有:全局变量、静态局部变量!

3、extern只能用来声明已定义的外部变量,不能用于变量的定义


内部函数和外部函数

内部函数:只能被本文件中其他函数所调用,格式如:static int fun(int a, int b)

外部函数:可供其它文件调用。定义函数时省略,默认为外部函数;调用时,要用extern声明所用函数是外部的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值