1、static的作用
1-修饰局部变量
1.概念:当使用
static
关键字修饰局部变量时,该变量就变成了静态局部变量。这意味着它不再是传统的自动存储期变量,而是具有静态存储期。2.作用域:静态局部变量的作用域确实没有变化,它仍然是在其定义的局部范围内,即它所在的代码块(例如函数体)内部。在作用域外,该变量是不可见的。
3.生存期:静态局部变量的生存期与全局变量类似,都是全局的。这意味着静态局部变量在程序开始执行时就已经存在,并且直到程序结束才会被销毁。这与普通的局部变量不同,普通局部变量在函数被调用时创建,在函数返回时销毁。
4.特点:静态局部变量的初始化只会在第一次进入包含它的函数时发生。之后,每次函数被调用时,该变量都会保留上一次函数返回时的值,而不是被重新初始化。这是静态局部变量与普通局部变量之间的主要区别。
插曲:
外部链接:
- 外连接允许其他源文件或库访问的函数和变量。如果一个名称(如函数或变量)对编译单元(.cpp文件)来说不是局部的,那么在链接的时候,其他的编译单元可以访问它,也就是说它可以和别的编译单元交互。
- 当使用
extern
关键字标记函数或变量时,它们就具有外连接。这意味着这些函数或变量可以在其他源文件中使用。例如,在一个源文件中定义了一个全局变量或函数,并在另一个源文件中使用extern
关键字声明它,那么后者就可以访问前者定义的变量或函数。
内部链接:
- 内连接意味着函数和变量只能在定义它们的源文件中使用。如果一个名称对编译单元来说是局部的,那么在链接的时候,其他的编译单元无法链接到它,且不会与其他编译单元中的同名标识符相冲突。
- 默认情况下,如果没有使用
extern
标识符,函数和变量将具有内连接。此外,使用static
关键字也可以明确指定内连接。这意味着即使在其他源文件中定义了具有相同名称的函数或变量,编译器也不会产生冲突,因为每个源文件都有自己的独立作用域。
2-修饰全局变量
1.概念:
当static
修饰全局变量时,该全局变量的链接属性从外部链接变为内部链接。这意味着该全局变量仅在其定义的源文件中可见,而在其他源文件中是不可见的。2.作用域:
全局变量的作用域是整个程序,包括所有的源文件。但是,当全局变量被static
修饰后,其作用域并没有改变,仍然是全局的。但是,它的可见性被限制在了定义它的源文件中。3.链接属性:
通常,全局变量具有外部链接属性,这意味着它们可以在多个源文件之间共享和访问。但是,当全局变量被static
修饰后,其链接属性变为内部链接,这意味着该变量只在定义它的源文件中可见,其他源文件即使使用相同的变量名也不会冲突。因此,
static
修饰全局变量的主要作用是限制其可见性,确保它在其他源文件中不会被误用或产生命名冲突。这对于创建只在特定源文件中使用的辅助变量或计数器非常有用。
3-修饰函数<