透视 static 和 extern 对函数的重大影响

  • 在 C 语言的世界里, staticextern 这两个关键字在函数的运用中有着至关重要的地位和深远的影响。它们犹如两把神奇的钥匙,为我们打开了理解函数特性和作用域的大门。

一、生命周期和作用域

  • 在讲解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 的协同与冲突

  • 在某些情况下, staticextern 可以协同工作,共同构建出复杂而精巧的程序结构。比如,一个模块中的函数可以通过 extern 共享全局的静态变量,实现特定的功能交互。

  • 但同时,它们也可能产生冲突。如果在不同的文件中对同一个变量既使用了 static 又使用了 extern ,可能会导致链接错误或意外的行为。

1、static修饰全局变量

在这里插入图片描述

  • extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤extern进⾏声明,然后使⽤。
  • 但运行时代码1正常,代码2在编译的时候会出现连接性错误。
  • 那是因为⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被static修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。
  • 所以,如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤
    static修饰。

2、static修饰函数

在这里插入图片描述

  • 代码1可以正常运行,代码2运行时出现异常。

  • 其实static 修饰函数和static修饰全局变量是⼀样的,⼀个函数在整个⼯程都可以使⽤,被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。

  • 在实际编程中,我们需要根据具体的需求和场景,合理地运用 staticextern 。要充分考虑到变量的生命周期、作用域和可维护性等因素。正确地使用它们,可以让我们的代码更加简洁、高效和可靠;而错误地使用则可能引发一系列难以调试的问题。

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值