请教一个c语言extern的问题
A.c 文件中定
int i = 10;
void fun(void)
{
//code
}
B.c 文件中用extern 修饰:
extern int i;//写成i = 10;行吗?
extern void fun(void);//两个void 可否省略?
另外C.h 文件中定义
int j = 1;
int k = 2;
D.c 文件中用extern 修饰:
extern double j;//这样行吗?为什么?
j = 3.0;//这样行吗?为什么?
自己百度了一下,发现好几个版本的答案,所以求各大神解答。。。
[解决办法]
1、extern只是导出变量和函数供调用,所以绝对不要有extern int i = 10;extern double j= 3.0这样的写法;
2、最好不要省略void,它对于编译器检测参数和返回值类型非常有帮助;
3、不要声明和导出用不同类型,没有任何意义。
[解决办法]
实际在正常使用过程中,个人不太建议频繁的使用extern,这明显把代码弄的乱七八糟的
[解决办法]
1、extern int i;//写成i = 10;行吗?
这样写的话,那么就会当成你定义一个变量i并且这个变量i是可以再外部访问的,而你这里的意思是要申明在a.c文件定义的变量,所以不能这么写否则会导致重复定义。
2、extern void fun(void);//两个void 可否省略?
返回类型的void 不可以省略,但是参数列表的void可以
3、extern double j;//这样行吗?为什么?
这样不行,因为这句话的意思是申明一个外部定义的变量 double j, 但是你未在其它地方定义所以不行
4、j = 3.0;//这样行吗?为什么?
这句话不行,因为 j 没有找到定义的地方
[解决办法]
建议 lz 找本语法书 看看
[解决办法]
三年的一个帖子,看一下6楼的回答,相信可以帮助楼主理解extern变量
http://topic.csdn.net/u/20090730/18/c82db8af-6488-411a-b734-56bddd61a467.html
[解决办法]
可以google "c语言 强弱符号"
extern实际上只是链接期的一个外部链接, 告诉编译器在编译期的时候忽略这个变量, 在链接期的时候再去找这个变量
[解决办法]
extern外部变量或函数时,要保证其形式一致,建议不要试图去测试不确定性的行为。
extern同名但不同类型变量时编译不出错的话,在连接重定位时也必然出错。不建议使用同名变量,防止同名变量互相影响可以在变量前加static关键字,将其作用域限定在当前文件中。
建议自己用编译器调试看下结果,毕竟编译器不同、相同编译器设置不同、机器不同都会有不一样的结果,这种情况以现场调试为准。
[解决办法]
lz,给你推荐本书 《C语言参考手册》