大家好,我是电源漫谈,在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进行变量申明。
这里需要注意的是,对于宏定义和结构体或者联合体等类型,可以在头文件中定义,因为他们只是存在于编译阶段,不会涉及到文件链接。