静态全局变量和全局变量都是在函数外部定义的变量,它们有相似的地方,也有一些差别。下面是它们各方面的对比:
1、生命周期
- 全局变量:生命周期是从程序开始运行到程序结束。
- 静态全局变量:生命周期也是从程序开始运行到程序结束。
2、存储位置
- 全局变量:存储于静态存储区。初始化的全局变量存于静态存储区的数据段,未初始化的存于
BSS
段(Block Started by Symbol
)。 - 静态全局变量:与全局变量一样。
3、作用域
- 全局变量:作用域是整个程序。在一个源文件中定义的全局变量,可通过
extern
关键字在其他源文件中声明并使用。 - 静态全局变量:作用域仅限于定义它的源文件。其他源文件无法访问该变量,即使使用
extern
声明也不行。
4、链接属性
- 全局变量:全局变量作用域是整个程序,所以它是具有外部链接属性的。意味着在链接阶段,不同源文件中同名的全局变量会被视为同一个变量。所以不同源文件如何定义同名全局变量,在链接阶段会出现“符号重定义”(
redefinition of symbol
)错误。 - 静态全局变量:静态全局变量作用域仅限于定义它的源文件,所以它是内部链接属性。意味着在链接阶段,不同源文件中同名的静态全局变量会被视为不同变量。所以不同源文件的静态全局变量可以重名。
5、使用
- 全局变量:
- 全局变量只能在源文件定义。如果定义在头文件,头文件可能被多个源文件
include
,这就会导致多个源文件定义同名的全局变量,最终在链接时报“符号重定义”(redefinition of symbol
)错误。 - 全局变量在头文件只能声明。在头文件中使用
extern
声明全局变量,其他源文件include
该头文件,相当于这些源文件都声明了该全局变量,这些源文件就可以直接使用全局变量了。
- 全局变量只能在源文件定义。如果定义在头文件,头文件可能被多个源文件
- 静态全局变量:
- 静态全局变量可以在头文件中定义。如果定义在头文件,头文件被多个源文件
include
,就相当于这些源文件定义了同名的静态全局变量。但要注意,这些静态全局变量是不同变量,所以它们是互不影响的,它们不能实现数据的共享。
- 静态全局变量可以在头文件中定义。如果定义在头文件,头文件被多个源文件