【C语言】static 和 extern 的理解和应用。

对于 C 语言的初学者,对 static 和 extern 的理解可能会遇到一些问题。

用在哪?

首先明确 static 和 extern 可以用在哪?
static 和 extern 都可以用来修饰【变量】和【函数】。ok,知道这么多就行了,所谓实践出真知,下面直接举例

举例

  1. extern 修饰全局变量
// file1.c
int a = 0;

// file2.c
extern int a;
printf("a=%d", a);

即在 file2.c 中可以通过 extern 来使用定义在 file1.c 中的 a 变量。(必须要通过CMakeLists.txt将其都包含在源文件中)
如果使用 static 修饰 a 的话,这 a 这个变量只能在 file1.c 这个文件中使用,不能通过 extern 在其他文件中使用。比如这么写就是错的:

// file1.c
static int a = 0;

// file2.c
extern int a; //此处会报错
printf("a=%d", a);

思考一个问题,如果 file2.c 直接 #include “file1.c”,那么可以用 a 变量吗?(答案是可以,因为#include 相当于把 file1.c 直接写到 file2.c 中,它两相当于是同一个文件,注意别在CMakeLists.txt中包含 file1.c 了,会报参数定义重复的问题)

  1. extern 修饰局部变量
// file1.c
int a = 0;

// file2.c
void printA() {
	extern int a;
	printf("a=%d", a);
}

即此时 通过 extern 将 a 在 printA() 方法中引入,只在 printA() 方法中可见。

  1. static 修饰局部变量
void increaseA(){
	static int e = 0;
    e++;
    printf("e=%d\n", e);
}

int main() {
    increaseA();
    increaseA();
    increaseA();
    increaseA();
    increaseA();
    increaseA();
    return 0;
}

输出:

e=1
e=2
e=3
e=4
e=5
e=6

说明什么呢?说明 e 是一直存在的,直到程序结束才释放,只是其使用的作用域在 increaseA() 方法内。

  1. extern 修饰方法
//file1.c
void test1(){
	//...
}

//file2.c
extern void test1(); 

int main(){
	test1();
}
  1. static 修饰方法
//file1.c
static void test1(){
	//...
}

//file2.c
extern void test1(); //这里是错的,无法编译
  1. static 修饰的头文件变量
//file1.h
static a = 1;

//file2.c
#include "file1.h"

printf("a=%d",a); //输出 1
a = 2;
printf("a=%d",a); //输出 2

//file3.c
#include "file1.h"
printf("a=%d",a); //输出 1
a = 3;
printf("a=%d",a); //输出 3

可以看到,在 file2.c 中 修改了 a 并不影响 file3.c 中的值。为啥?因为 #include 相当于将 file1.h 直接写到了 file2.c 和 file3.c 中,而 a 只在文件内有效,所以其实相当于是在 file2.c 和 file3.c 中各定义了一个 a, 是两个不同的变量,互不影响。

总结

  1. static关键字用于局部变量时,会将变量的生命周期从自动存储期扩展到整个程序的执行期间。
  2. static用于全局变量或函数时,改变的是它们的链接属性(从外部链接到内部链接),生命周期仍然是整个程序的执行期间。
  3. extern关键字不创建变量或函数,因此不影响生命周期,它用于声明在其他地方定义的全局变量或函数以便跨文件访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值