问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

extern和static的作用(有例子)

创作时间:
作者:
@小白创作中心

extern和static的作用(有例子)

引用
CSDN
1.
https://blog.csdn.net/2301_79461876/article/details/146379197

在C语言编程中,extern和static是两个非常重要的关键字,它们分别用于控制变量和函数的作用域和生命周期。本文将通过理论解释和代码示例,帮助读者深入理解这两个关键字的使用场景和具体作用。

一、extern

extern的作用

  1. 声明而非定义
    extern告诉编译器某个变量或函数存在于其他地方(通常是另一个源文件),当前只是声明它,而不是定义它(分配内存)。定义只能在一个地方出现,而声明可以多次。
  2. 跨文件共享
    它允许在多个源文件之间共享全局变量或函数,避免重复定义导致的链接错误。

例子:

1、头文件中的extern声明

文件结构:

  • shared.h:头文件,包含extern声明。
  • shared.c:定义全局变量和函数。
  • main.c:使用头文件中的声明。

shared.c(定义)
shared.h(声明)
main.c(使用)

2、源文件中的extern声明

文件结构:

  • file1.c:定义全局变量和函数。
  • file2.c:使用extern声明并访问file1.c中的变量和函数。

file1.c(定义)

file2.c(声明并使用)

二、static

static在全局变量中的作用

  • 链接属性(改变)
    默认全局变量具有外部链接性,而static将其改为内部链接性(internal linkage),限制其作用域为当前源文件,其他文件无法通过extern访问。
  • 生命周期(不变)
    从程序开始运行到结束,贯穿整个程序生命周期。

static在局部变量中的作用

  • 生命周期(改变)
    贯穿整个程序生命周期,与程序生命周期相同,而不像普通局部变量那样随函数退出而销毁。
  • 作用域(因为是局部变量,所以作用域还是在他自己的函数内部)
    仍然局限于定义它的块(如函数内部),外部无法访问。

例子:分为全局变量使用和局部变量使用

1、全局变量使用static

一、不使用static情况:

解释

  • globalVar没有static,具有外部链接性。
  • file2.c通过extern成功访问并修改了file1.c中的globalVar,两者共享同一变量。

二、使用static情况:

解释

  • globalVar被static修饰,具有内部链接性,仅在file1.c中可见。
  • file2.c无法通过extern访问,链接器找不到globalVar的定义。

2、局部变量使用static

一、局部变量不使用static

每次调用这个函数,局部变量都会被初始化为零
解释

  • callCount是普通局部变量,存储在栈上。
  • 每次countCalls()调用时,callCount重新分配内存并初始化为0,函数退出后销毁,因此每次输出都是1。

二、局部变量使用static

解释

  • callCount被static修饰,存储在静态数据区。
  • 只在第一次调用时初始化为0,后续调用保留之前的值,因此每次调用递增,实现了计数功能。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号