全局变量(Global Variables)
- 定义位置:全局变量在函数外部定义,可以在整个程序范围内访问。
- 作用域:它们的作用域是全局的,即在程序的任何部分(包括所有函数)都可以访问到这些变量,除非它们在代码块或函数内部被局部变量遮蔽。
- 生命周期:全局变量在程序的整个运行期间都存在,它们在程序启动时被初始化,并在程序结束时被销毁。
- 命名空间:全局变量位于全局命名空间中,不同于局部变量的命名空间。
静态变量(Static Variables)
- 定义位置:静态变量可以在函数内部或外部定义。
- 静态全局变量:在函数外部定义,使用
static
关键字,其作用域限定在定义它的文件内部,即其他文件无法访问。 - 静态局部变量:在函数内部定义,同样使用
static
关键字,它在函数调用结束后不会消失,而是保留其值,直到程序结束。
- 静态全局变量:在函数外部定义,使用
- 作用域:静态全局变量的作用域限于定义它的文件,而静态局部变量的作用域限于定义它的函数。
- 生命周期:静态变量的生命周期与全局变量相同,都是从程序开始到结束。但是,静态局部变量的值在函数调用结束后不会重置,而是保持上一次的值。
- 命名空间:静态变量与全局变量一样,位于全局命名空间中,但它们通过作用域的限制来避免命名冲突。
主要区别
- 作用域:全局变量在整个程序中可见,而静态全局变量仅在定义它的文件中可见。静态局部变量仅在定义它的函数内可见。
- 生命周期:尽管两者的生命周期都是整个程序运行期间,但静态局部变量在函数调用之间保持其值,而自动局部变量(非静态)在每次函数调用时重新初始化。
- 初始化:全局变量和静态全局变量在程序启动时初始化一次,如果未显式初始化,则初始化为0。静态局部变量在第一次调用其定义的函数时初始化,之后保持值不变,如果未显式初始化,也会初始化为0。
- 可见性:全局变量可以被程序中的任何部分访问,而静态变量的可见性受到限制。