四星 C++ 变量的区别

全局变量、局部变量、静态全局变量、静态局部变量的区别
C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。

从作用域看:

全局变量: 具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用 extern 关键字再次声明这个全局变量。

静态全局变量:具有文件作用域。它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被 static 关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

局部变量:具有局部作用域。它是自动对象(auto),在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

静态局部变量:具有局部作用域。它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
从分配内存空间看:

1
2
3
4
5
6
7
8
9
10
11
12
13
//对于数据来说,声明和定义往往是同时存在的,比如下面的一行语句,既定义也声明了。
int a = 10;
//只声明不定义
extern int data;
//对于函数来说,函数声明一般写在头文件中,函数的定义一般写在源文件中;
//声明
void helloworld();
//函数定义
void helloworld() {
std::cout << "hello world" << std::endl;
}
//使用变量之前必须声明,声明可以有多次,而定义只能有一次。

静态存储区: 全局变量,静态局部变量,静态全局变量。
栈: 局部变量。

静态变量和栈变量(存储在栈中的变量)、堆变量(存储在堆中的变量)的区别:静态变量会被放在程序的静态数据存储区(.data 段)中(静态变量会自动初始化),这样可以在下一次调用的时候还可以保持原来的赋值。 而栈变量或堆变量不能保证在下一次调用的时候依然保持原来的值。

静态变量是通过区分存放位置来保证其特殊的生命周期的。栈变量程序会自动释放。堆变量要由程序员自己释放。
静态变量和全局变量的区别:静态变量用 static 告知编译器,自己仅仅在变量的作用范围内可见

对于静态全局变量,只在该文件中生效,在其他文件中不生效,因此,在其他文件中,可以定义同名的静态全局变量。

对于静态局部变量,在局部函数体中,只要被初始化,就会一直存在,不会被释放。

全局变量,定义后,在其他文件中声明,就可以使用,不能存在同名的定义。并不需要引用头文件文件,但是依然可以在不同文件间共享变量和函数,这一切都是extern的功劳!

××××

**全局变量定义在头文件中会出现什么问题 **

如果在头文件中定义全局变量,当该头文件被多个文件 include 时,该头文件中的全局变量就会被定义多次,导致重复定义,因此不能再头文件中定义全局变量。

include一个头文件,相当于把他带包写到了另一个文件,就会被多次定义。

所以全局变量应该被定义在源文件中。 其他程序使用,利用extern进行声明。