extern实现源文件(头文件)之间变量和函数的引用
程序员文章站
2023-12-21 21:34:58
...
在一个C工程中,会有很多源文件,因此当在一个源文件中调用另一个源文件中的函数或者使用另一个源文件中定义的变量和结构体时,如何保证函数和变量的可见性呢?
1.结构体和变量的调用
下面是看到的关于结构体中的使用:http://blog.csdn.net/Fortware/article/details/44208309?locationNum=10
总结下来就是:包含头文件之后,定义的结构体变量必须用extern声明。
//比如在b.c中想使用a.h中的结构体,步骤如下:
#include “a.h” // 1.包含需要的头文件
struct test c; // 2.先定义一个结构体变量(定义,不是声明)
extern struct test c; // 3.声明要调用的结构体变量是全局的外部变量
int main(){
// 4.接下来就可以对结构体变量c进行赋值了
c.a = 1;
c.b = 2;
}
2.函数的调用
函数声明方法时,可用extern声明,也可省略extern,
a.c文件中:
double squ(double x)
{
return x*x;
}
b.c文件中:
#include<stdio.h>
extern double squ(double x); //这里不加extern运行也没有问题,一般还是加上
int main()
{
printf("%f",squ(3.0));
return 0;
}
3. 小结 :为什么方法可以不加extern而变量必须加呢?原因如下:
函数声明主要是给链接器一个明确的hint,从而在匹配函数名字以后还能检查一下类型是否正确。至于extern
关键字,对于函数声明本身是无所谓的,反正末尾一个分号编译器就懂了,能识别出来这是个声明而不是定义;只是对于变量的声明,没它就不行。
C标准里是怎么要求的我不确定,不过建议是,对于本文件的函数不加extern
,外部文件的加上,这样可以给读源码的人一个hint。一般来说,声明都是放在头文件里的,这样你不用在所有用到它的 .c
文件里都写上一大堆声明,而只需要引入一个头文件,也避免声明得和实现不一致(头文件通常和实现一起分发的)。