在刚接触的项目中,同事对extern的使用错误导致我冤枉花了近4个小时去发现错误,痛心啊,
总结下extern的使用吧:
extern用在变量和函数在别的文件中需要调用时
1:变量
在一个源文件里定义了一个数组: char a[6];
在另外一个文件里用下列语句进行了声明: extern char *a;
请问,这样可以吗?
答案与分析: 不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。
2: 函数
1: 在函数对应的头文件中extern外部要用到的函数,外部调用头文件就OK,但尽量避免这样,因为头文件包
含了太多东西
2: 如果函数func定义在a.c里面,在b.c里面incude "a.c" 就可以调用
3: 对1 所作分析怀疑,经过测试发现(环境redhat 9.0),函数都编译的话好像可以直接使用另一个文件的函数,除非它static了,是链接的时候调用的吗?
对观点1的总结 : extern的使用地方,觉得在头文件中extern和在需要用到的文件中extern相比,后者更人性,前者更简洁
对观点 2 和 3 的总结 : 如果链接的时间不一样,可能就不奏效了