目录
- 一、生命周期和作用域
- 1、生命周期
- 2、作用域
- 二、static 的影响
- 1、static的作用
- 2、static 修饰局部变量
- 三、extern 的魔力
- 四、static 与 extern 的协同与冲突
- 1、static修饰全局变量
- 2、static修饰函数
- 在 C 语言的世界里, static 和 extern 这两个关键字在函数的运用中有着至关重要的地位和深远的影响。它们犹如两把神奇的钥匙,为我们打开了理解函数特性和作用域的大门。
一、生命周期和作用域
- 在讲解static和extern之前,我们需要了解一下作用域和⽣命周期。
1、生命周期
指的是变量在程序运行过程中存在的时间范围。
- 全局变量的生命周期是整个程序的运行期间,从程序开始执行到程序结束。
- 局部变量的生命周期是在其所在的函数或代码块被执行期间,当函数或代码块执行结束,局部变量就被销毁。
2、作用域
是指变量在程序中可以被访问的范围。
- 全局作用域:全局变量具有全局作用域,可以被程序中的任何函数访问。
- 局部作用域:局部变量通常只在其所在的函数或代码块内可见和可访问,出了这个范围就无法再直接使用。
二、static 的影响
1、static的作用
-
当我们在函数内部使用 static 修饰变量时,就开启了一段独特的旅程。
-
首先, static 变量具有静态存储期。这意味着它在程序的整个运行期间都存在,而不像普通的自动变量在函数调用结束后就消失。这种持久性使得 static 变量能够在函数的多次调用之间保持其值。例如:
void increment()
{static int count = 0;count++;printf("当前计数: %d\n", count);
}
每次调用 increment 函数, count 的值都会在上一次的基础上递增。其次, static 变量的作用域被限制在声明它的函数内。这确保了变量的封装性和局部性,不会被其他不相关的函数意外访问或修改。
2、static 修饰局部变量
- 代码1和代码2的效果做下对比,我们就能理解static修饰局部变量的意义所在了:
1、代码1的test函数中的局部变量i是每次进⼊test函数先创建变量(⽣命周期开始)并赋值为0,然后
++,再打印,出函数的时候变量⽣命周期将要结束(释放内存)。
2、代码2中,我们从输出结果来看,i的值有累加的效果,其实test函数中的i创建好后,出函数的时候是
不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算。 - 结论:static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被static修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作⽤域不变的。
三、extern 的魔力
-
extern 则为我们展现了函数之间共享信息的奇妙方式。
-
通过使用 extern 关键字来声明一个全局变量,我们可以在多个函数中访问和操作这个变量。它打破了函数之间的壁垒,实现了数据在程序不同部分之间的流通。比如:
extern int globalVariable;void function1() {// 使用 globalVariable
}void function2() {// 也使用 globalVariable
}
在这里, globalVariable 可以在多个函数中被共同使用,促进了程序的整体性和协调性。然而,使用 extern 也需要谨慎。如果不小心管理,可能会导致变量被意外修改,引发难以察觉的错误和混乱。
四、static 与 extern 的协同与冲突
-
在某些情况下, static 和 extern 可以协同工作,共同构建出复杂而精巧的程序结构。比如,一个模块中的函数可以通过 extern 共享全局的静态变量,实现特定的功能交互。
-
但同时,它们也可能产生冲突。如果在不同的文件中对同一个变量既使用了 static 又使用了 extern ,可能会导致链接错误或意外的行为。
1、static修饰全局变量
- extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤extern进⾏声明,然后使⽤。
- 但运行时代码1正常,代码2在编译的时候会出现连接性错误。
- 那是因为⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被static修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。
- 所以,如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤
static修饰。
2、static修饰函数
-
代码1可以正常运行,代码2运行时出现异常。
-
其实static 修饰函数和static修饰全局变量是⼀样的,⼀个函数在整个⼯程都可以使⽤,被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。
-
在实际编程中,我们需要根据具体的需求和场景,合理地运用 static 和 extern 。要充分考虑到变量的生命周期、作用域和可维护性等因素。正确地使用它们,可以让我们的代码更加简洁、高效和可靠;而错误地使用则可能引发一系列难以调试的问题。