免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4878 | 回复: 16
打印 上一主题 下一主题

两个文件可以有同一个变量名? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-20 21:05 |只看该作者 |倒序浏览
a.c

  1. int i;

  2. a()
  3. {
  4.     i = 1;
  5. }
复制代码


b.c

  1. iint i;

  2. int main()
  3. {
  4. a();
  5. }
复制代码


  1. cc a.c b.c
复制代码

竟然没问题
怎么变量i不冲突的吗?

论坛徽章:
0
2 [报告]
发表于 2007-06-20 21:22 |只看该作者
似乎是为了和早期的代码兼容,所以目前 C 编译器一般还是把 int i; 等同于 extern int i;
如果将两个都写成 int i = xx;,那就会报错了

[ 本帖最后由 antigloss 于 2007-6-20 21:24 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-06-20 21:40 |只看该作者
原帖由 bleem1998 于 2007-6-20 21:05 发表
a.c

  1. int i;

  2. a()
  3. {
  4.     i = 1;
  5. }
复制代码


b.c

  1. iint i;

  2. int main()
  3. {
  4. a();
  5. }
复制代码


  1. cc a.c b.c
复制代码

竟然没问题
怎么变量i不冲突的吗?

链接时强弱符号问题。
论坛里有过这种帖子,搜搜,或到网上搜也一样。

论坛徽章:
0
4 [报告]
发表于 2007-06-20 21:41 |只看该作者
没有赋值语句的就是声明。
没有scope修饰符的声明缺省是extern的。
你可以在程序内、一个文件内多次声明同一个变量。
这都是c标准。

论坛徽章:
0
5 [报告]
发表于 2007-06-20 21:45 |只看该作者
原帖由 福瑞哈哥 于 2007-6-20 21:41 发表
没有赋值语句的就是声明。
没有scope修饰符的声明缺省是extern的。
你可以在程序内、一个文件内多次声明同一个变量。
这都是c标准。



原来如彼阿
学习了

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2007-06-20 22:03 |只看该作者
原帖由 福瑞哈哥 于 2007-6-20 21:41 发表
没有赋值语句的就是声明。
没有scope修饰符的声明缺省是extern的。
你可以在程序内、一个文件内多次声明同一个变量。
这都是c标准。



建议还是参考一下 zx_wing 的回复。

论坛徽章:
0
7 [报告]
发表于 2007-06-20 22:18 |只看该作者
原帖由 MMMIX 于 2007-6-20 22:03 发表



建议还是参考一下 zx_wing 的回复。


好像还没有回答正确的。还是参考一下经典书吧:详细,权威 C: A Reference Manual 5th 4.8.4

我的筆記:http://blog.chinaunix.net/u/23408/showart.php?id=246603
The expression is deemed as a declaration if there is a definition in the same translation unit. Otherwise compiler will automatically define an i for you. But On linkage, variables defined by that means will be dealt with specially. Reference says that different compilers may choose different rules. According to test, GCC chooses which is called Mixed Common Model (4.8.4) by Reference. That is: if there are more than one translation unit contains such definition for i, those definitions will be combined into only one definition. Note how that is different from other kinds of definitions: multiple-definition is just illegal.

[ 本帖最后由 lgfang 于 2007-6-20 22:49 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2007-06-20 22:49 |只看该作者
原帖由 lgfang 于 2007-6-20 22:18 发表


好像还没有回答正确的。还是参考一下经典书吧:详细,权威 C: A Reference Manual 5th 4.8.4

http://blog.chinaunix.net/u/23408/showart.php?id=246603
The expression is deemed as a decla ...

这段文字有些误导,不过关于应该参考 C: A Reference Manual 5th 我倒是赞同。

[ 本帖最后由 MMMIX 于 2007-6-20 23:04 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-06-21 09:35 |只看该作者
实际上都是些细节问题。

这么说吧,在k&r c中,一个文件只能包括两种:声明和函数定义。从这个原则看,定义是声明的一种。

你可以多次声明同一个变量,但只能定义(初始化)一次也是毫无疑问的。

如果你只有声明而无定义(也就是无初始化)时,c语言标准规定会把这些声明合并成一个初始化为0的定义。我觉得这也就是一种说法,不如把它理解成当无初始化时c语言会自动生成一个初始化为0更好一些,因为声明还在,如果没有声明,程序不是就要报警了嘛。

至于上面网友提到过的连接符号强弱没听说过。

论坛徽章:
0
10 [报告]
发表于 2007-06-21 10:34 |只看该作者
用 nm 打印的 a.o 符号表:

00000000 F a.c
00000000 T a
00000004 C i

b.o:

00000000 F b.c
         U __guard
         U __stack_smash_handler
         U a
00000004 C i
00000000 T main

仅供参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP