请教一个c语言extern的问题

fjp790308446 2012-09-19 09:21:13

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;//这样行吗?为什么?


自己百度了一下,发现好几个版本的答案,所以求各大神解答。。。
...全文
296 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 xiezhunben 的回复:
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 没有找到定义的地方
今天看一本pdf的书,发现了你的答案。 我用的gcc编译的,我对你的答案不敢苟同, 你最好亲自试一下
永不落伍 2013-09-16
  • 打赏
  • 举报
回复
引用 3 楼 xiezhunben 的回复:
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 没有找到定义的地方
4、错误 1 error C2371: “j”: 重定义;不同的基类型
xiezhunben 2012-09-20
  • 打赏
  • 举报
回复
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 没有找到定义的地方
「已注销」 2012-09-20
  • 打赏
  • 举报
回复
extern外部变量或函数时,要保证其形式一致,建议不要试图去测试不确定性的行为。
extern同名但不同类型变量时编译不出错的话,在连接重定位时也必然出错。不建议使用同名变量,防止同名变量互相影响可以在变量前加static关键字,将其作用域限定在当前文件中。

建议自己用编译器调试看下结果,毕竟编译器不同、相同编译器设置不同、机器不同都会有不一样的结果,这种情况以现场调试为准。
hu7324829 2012-09-20
  • 打赏
  • 举报
回复
可以google "c语言 强弱符号"

extern实际上只是链接期的一个外部链接, 告诉编译器在编译期的时候忽略这个变量, 在链接期的时候再去找这个变量
mymtom 2012-09-20
  • 打赏
  • 举报
回复
三年的一个帖子,看一下6楼的回答,相信可以帮助楼主理解extern变量
http://topic.csdn.net/u/20090730/18/c82db8af-6488-411a-b734-56bddd61a467.html
AnYidan 2012-09-20
  • 打赏
  • 举报
回复
建议 lz 找本语法书 看看
fjp790308446 2012-09-20
  • 打赏
  • 举报
回复
感谢楼上各位热心的回答?
ouPuso 2012-09-20
  • 打赏
  • 举报
回复
lz,给你推荐本书 《C语言参考手册》
xigua1102 2012-09-19
  • 打赏
  • 举报
回复
实际在正常使用过程中,个人不太建议频繁的使用extern,这明显把代码弄的乱七八糟的
图灵狗 2012-09-19
  • 打赏
  • 举报
回复
1、extern只是导出变量和函数供调用,所以绝对不要有extern int i = 10;extern double j= 3.0这样的写法;
2、最好不要省略void,它对于编译器检测参数和返回值类型非常有帮助;
3、不要声明和导出用不同类型,没有任何意义。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧