本文主要是介绍C++作用域和生存期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、变量的作用域和生存期
- 变量分为两种:
局部变量
和全局变量
:在大括号内出现的变量的都是局部变量
,其作用域
是该大括号内部,其生存期
也是该大括号内;在大括号外面定义的变量都是全局变量
,作用域
为从定义变量的位置到该源文件
结束,但是生存期
为整个程序的运行时间。局部变量
的作用域
无法改变,生存期
可以通过在定义局部变量时前面加上static声明
,将变量变为静态局部变量
,将其生存期
扩展为整个程序的运行时间,而作用域不变。对静态局部变量
的赋值是在编译时进行的,即只赋值一次,以后每次调用该变量时不再重新赋值而只保留上一次调用结束的值。全局变量
的生存期
无法改变,但是如果需要将该全局变量的作用域扩展到本源文件中该变量定义之前
或是其他源文件
,需要使用extern在使用该变量时进行声明;如果需要将该变量限制只在本源文件中使用,需要在变量定义是前面加上static
,该变量变为静态全局变量
,否则在其他文件中出现同名的变量时会出现编译错误。
二、函数的作用域和生存期
- 函数本质上是全局的,和全局变量的性质类似。函数的作用域为从定义该函数到该
源文件
结束,如果想扩展该函数的作用域,将该全局变量的作用域扩展到本源文件中该函数定义之前
或是其他源文件
,需要使用extern+函数原型
在使用该函数时进行声明,C++允许省写extern,extern+函数声明
就变成了函数声明
。因此函数声明
的作用就是扩展函数的使用范围的。函数原型通知编译系统该函数在本文件中稍后定义,或是在另一个文件中定义。 - 利用函数原型扩展函数作用域最常见的例子是
#include
指令的应用。例如在程序中需要调用sin
函数,但三角函数并不是由用户在本文件中定义的,而是存放在数学库中的。头文件cmath包括了对应的函数原型,用户只需用#include<cmath>
指令就可以合法的调用各种数学库函数了。
extern(对于函数就是函数原型)查找
函数
和变量
的顺序是:先在本源文件中
查找,如果有,则将其作用域扩展到本行开始;如果本文件中无此函数
或全局变量
,则在程序链接时
从其他文件找有无此函数
或全局变量
,如果有,则把在另一文件中定义的的函数
或全局变量
扩展到本文件,在本文件中合法的引用该函数
或全局变量
。
无论是函数还是变量
,在使用它时,我们都需要检查它们在之前是否已经被定义
,如果没有定义就需要检查它们是否已经被声明。既没有定义也没有声明的语句在C++中是错误的。
这篇关于C++作用域和生存期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!