理解C语言中的 extern和static关键字

目录

1.extern关键字

2.static关键字


1.extern关键字

当你使用 extern 关键字声明一个变量时,它表示该变量是在其他源文件中定义的,并且你希望在当前源文件中引用它。这使得多个源文件可以共享变量,而不会导致重定义错误。

 两个文件里的变量b不能通用所以导致代码错误​​​​​​​

 引用外部符号extern,就可以正常输出变量b


2.static关键字

  • 修饰局部变量:放在局部变量的前面,并将变量放在静态区,即使变量离开了作用域也不会立刻被销毁,变相的延长了生命周期。

    void text() {
        int a = 1;
        a++;
        printf("%d\n", a);
    }
    int main() {
        int i = 0;
        while (i < 5) {
            text();
            i++;
        }
        return 0;
    }

    如图,输出结果全部都是2,这是因为当我们的主函数进入while循环后,要调用text函数,变量a在此被定义且赋值为1,随后a++此时a为2,故被打印出来也为2,之后跳出函数,a的生命周期结束,再次循环,再次进入函数,a再次被赋值为1,a++再打印出2,直到主函数跳出循环。

    void text() {
    	static int a = 1;
    	a++;
    	printf("%d\n", a);
    }
    int main() {
    	int i = 0;
    	while (i < 5) {
    		text();
    		i++;
    	}
    	return 0;
    }

      如图,我们在变量a前面加上static,我们可以理解为将变量a放入了静态区,从而使得函数的每一次结束后,变量a由于改变了存储位置而没有被销毁,因此将a每次的循环结果保留了,故我们得到了每次a变量加1的结果。

  • 修饰全局变量 我们在前面的extern中的代码看到当我们使用extern后,两个.c文件中的变量a可以互相使用,而static修饰全局变量以后,将变相缩小作用域,两个文件不在可以互通。

 如图,可以看到代码是可以正常运行的.

 

当我们加入static后两个文件将不再相通,这就是static修饰全局变量的作用 ,作用域被限制在当前文件(text1.c)中,其他文件无法直接访问或修改它.

  •  修饰函数:static在修饰函数的时候,其实和修饰全局变量的效果一样,对其中一个文件进行封装

 

 如图代码正常运行,在text1.c中可以调用text2

 里的Add函数

当我们在Add前面加上static,这个代码就无法正常运行了,这就是static修饰函数的效果。

猜你喜欢

转载自blog.csdn.net/2301_77125473/article/details/131743290