关于 extern 你容易忽视的用法
扫描二维码
随时随地手机看文章
extern 的含义
首先看到 extern 的出现,我们应该明白其含义是全局的意思。其次当看到 extern 修饰一个变量时,我们应该能够区分这是对于一个变量的声明,相应的,有了对于变量的声明,那么就应该具备变量的定义。关于变量的声明和变量的定义的区别,笔者曾经看到一句话是这样进行描述的,变量的存在需要一个存储空间,那这个存储空间就好比是房子,那变量的声明就好比是你拿到了对于房子的房产证,但是还没有拿到房子,变量的定义便是你已经住到房子里面了,已经在使用房子了。关于 extern 所声明的全局变量,我们最常见的分为两种:
1、没有用 extern 声明的变量,直接在文件头定义。
2、用 extern 声明变量,然后再在一个 .c 文件定义变量
以上两种方式定义的变量定义的变量均称之为全局变量,只不过变量的作用域范围有所不同,第一种的作用域范围仅限于本文件,第二种方式定义的全局变量的作用域范围是整个工程。还有一种方法是笔者在阅读 RT_Thread 源码的时候发现的一种用法,其作用域范围介于上述两种之间。
直接在文件头定义
如图所示,在test1.c文件头定义了 iNum 变量,test1.c中的function0() 和 function1()都可以使用这个变量,最后在main函数中调用这两个函数,输出的值是2.但是 iNum 不能在 main.c 文件中使用,也就是不能跨文件使用。
extern 声明变量
为了能够使得变量能够跨文件使用,也就是作用域扩大到整个工程,这里引入里 extern 声明变量的用法,对于笔者的习惯而言,我一般是将 extern 声明的变量放在 .h 文件中,如下图所示:
这样,iNum 便可以跨文件进行使用了,但是跨文件使用的要进行头文件包含,要包含 extern 声明变量所在的头文件。
在函数内用 extern 声明变量
在函数内用 extern 声明变量与前两种的作用域范围有所不同,介于上述两者之间,具体的用法如下图所示:
我在 test.c 文件头定义了一个变量 iNum,但是没有在头文件进行声明,因此这个变量作为全局变量的作用域范围是 test.c 文件,但是与第一个例子不同的是,我虽然没有在头文件进行声明,但是我在 function.c 文件里的function3() 函数里声明了 iNum,所以它的所用域范围扩大到 function3() 函数内,当function3() 函数运行结束,iNum的作用域又缩小至 test.c 文件内。
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!