C语言变量申明和定义简析

大家好,我是电源漫谈,很高兴和各位一起分享我的59原创文章,喜欢和支持我的工程师,一定记得给我点赞、收藏、分享。

在C程序的书写中,往往会分为多个子文件,所以同一个变量不免会在多个C源程序文件中去访问使用,本文就这一基础问题做一些梳理。

如何在不同C文件使用同一个变量?

当你在一个C的源文件中定义了一个变量(而不是在头文件中定义变量),如果你想在另一个C源文件中去使用这个变量,那么此时你就可以使用extern来申明。

一般来说,比较推荐的方式是,定义一个头文件,来放置所有的相关申明,在任何一个想访问这个变量的C源文件中去包含这个头文件。

这里我们需要重点澄清两个定义,一个是变量定义,它是指编译器安排空间存储这个变量。另一个是变量申明,它是指让编译器知道其数据类型及它的存在,但是并不会定义它的存储空间。

实际示例说明

这里我们来举一个示例,我们定义一个易失变量volatile int start,需要在程序中任何一个位置可以访问它,因此,我们在main.c中去定义这个变量,如图1所示。

图1 变量的定义示例

如前所述,我们创建一个头文件,在这个头文件中去做这个变量start的申明,这里需要注意,在申明时需要包含所有定义时的限定符,这时就可以在任何想使用这个变量的C源文件中,通过包含头文件来使用这个变量了,如图2,3所示。

图2 在其它C文件中使用变量

如何避免重复定义和申明?

图3 在头文件中进行变量申明

当我们在头文件中,申明变量时,为了避免不同C源文件使用同一个变量时,编译器会重复定义这个变量,我们需要使用如图3所示的guard条件。

图4 在变量原始定义C文件中引用申明头文件

一般的,建议在定义这个变量的C源文件中也要增加这个头文件申明,这样做的好处是让C文件中的变量定义重新检查,看看它是否和头文件中的申明一致,如果不一致,编译器会给出警告,用户就会处理。

简要总结

不建议在头文件中定义变量,因为当C文件进行编译时,会将它用到的头文件原样放置在C文件中,如果对于一个文件用到这个变量时,就会出现重复的变量定义错误。所以,一般建议在C源文件中定义变量,但是在头文件中用extern进行变量申明。

这里需要注意的是,对于宏定义和结构体或者联合体等类型,可以在头文件中定义,因为他们只是存在于编译阶段,不会涉及到文件链接。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 5
收藏 5
关注 413
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧