juliusun.com
第 46/50 节 冥河C语言教程
除了头文件信息可以共用,源文件信息也可以共享。
通过extern关键字,可以使用其它源文件里面的函数或变量。
大型项目,源代码要多人合作编写。不同的源文件之间共享变量和函数是十分必要的。
extern关键字,就是出于这种考虑而引入的。通过extern可以引用其它源文件里的全局变量和函数。
局部变量仅在函数内有效,extern关键字当然也不能引用。函数不允许嵌套定义,是没有全局或是局部之分的。
extern就是外部的意思。外部变量指其它源文件中的全局变量,外部函数指其它源文件中的函数。
多个源文件共用一个函数或全局变量,需要在一个源文件中正常声明定义全局变量或函数,然后在需要引用此变量或函数的其它源文件中,使用extern关键字声明下相应的外部变量或函数。
extern 类型 外部变量或函数名;
由于extern声明的变量或函数在外部文件中,因此用extern关键字声明的变量是不需要赋值的。
变更如果是数组,需要数组长度时需要指明长度,但是不需要指明各元素的值。不需要长度时,元素个数都可以省略,这些信息在外部文件中已经定义好了,编译器通过变量或函数名即可从外部文件中获取相关信息。
引用外部函数时,就相当于在函数声明前加个extern关键字指示来自外部文件。
需要注意,多个源文件引用头文件共享代码时,头文件的代码类似于复制进源文件,本质是分开的,比如头文件中有全局变量i,两个源文件引用,则这两个源文件中的i互不影响而源文件中通过extern引用的代码,是共同的,改变其中一个,另一个也随之变。
通过extern关键字声明后,以后的代码就可以像自己定义过变量或函数一样使用它了。
实际定义全局变量或函数的源文件中,代码正常书写即可。
假设源文件a.c中定义了int类型变量i,在b.c中需要引用,那么各个源文件中写法如下:
a.c文件定义代码:
b.c文件引用a.c源文件中的变更i代码:
如果有多个文件都需要引用a.c中的变量i,写法与b.c中引用代码相同,均为extern int i;。
需要注意的是,多个源文件要同时参与编译,引用代码才会有效。同时编译,不同的开发环境操作不所不同。VC6编译器将需要编译的多个源文件放在同一个工程里即可;VS系列编译把多个源文件添加到同一个项目中即可,其它开发环境或编译器视具体情况而定。还需要注意一个工程或项目中无论多少源文件,只能有一个main函数。
以一个稍微复杂的例子说明一下,在源文件out.c中定义一个数组和一个函数。在in.c中引用out.c中的数组和函数。in.c和out.c一同编译。
out.c中的代码如下:
in.c中的代码如下:
效果类似如下图:
运行平台不同效果图有所差异。