免费注册 查看新帖 |

Chinaunix

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

[C] 为什么可以定义两个相同的结构体而不出错? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-21 13:56 |只看该作者 |倒序浏览
我在两个文件里分别定义了名称相同的两种结构体,但是它可以运行正常,不知道为啥,但同一文件里定义就不行,难道链接的时候不管吗?,thanks

gcc test.c test2.c

test.c
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <string.h>
  4. typedef struct tstnode
  5. {
  6.     int rightid;
  7. } TSTNODE;

  8. void test(void);
  9. int main(void) {
  10.         test();
  11.         test2();
  12. }
  13. void test(void) {
  14.         TSTNODE a={1};
  15.         printf("rightid is %d\n",a.rightid);
  16. }
复制代码



test2.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct tstnode
  4. {
  5.     char *leftid;                       
  6. } TSTNODE;

  7. void test2(void) {
  8.         TSTNODE a={"abc"};
  9.         printf("leftid is %s\n",a.leftid);
  10. }

复制代码

[ 本帖最后由 wwdwwd 于 2009-11-21 13:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-21 13:57 |只看该作者
为啥要出错?

论坛徽章:
0
3 [报告]
发表于 2009-11-21 14:03 |只看该作者
连接器是看不到类型定义的,它也无需关心类型定义。

论坛徽章:
0
4 [报告]
发表于 2009-11-21 14:21 |只看该作者
名字空间

论坛徽章:
0
5 [报告]
发表于 2009-11-21 14:41 |只看该作者
原帖由 langue 于 2009-11-21 13:57 发表
为啥要出错?

如果不出错的话,意味着整个项目中有多个名称相同,但实际上不同的结构体,这样的话,别的文件要使用时就不知道该使用哪个啦

论坛徽章:
0
6 [报告]
发表于 2009-11-21 14:42 |只看该作者
原帖由 cugb_cat 于 2009-11-21 14:21 发表
名字空间

名字空间跟这个有关吗?能说的详细一些吗?

论坛徽章:
0
7 [报告]
发表于 2009-11-21 15:59 |只看该作者
原帖由 wwdwwd 于 2009-11-21 14:41 发表

如果不出错的话,意味着整个项目中有多个名称相同,但实际上不同的结构体,这样的话,别的文件要使用时就不知道该使用哪个啦


这属于工程问题了,命名规范,设计架构等方面,本来就不应该出现不同意义却重名的现象,与其找借口证明重名合理性还不如想办法去掉重名

论坛徽章:
0
8 [报告]
发表于 2009-11-21 17:26 |只看该作者

lz 你可以调试下 include "test.c"

论坛徽章:
0
9 [报告]
发表于 2009-11-22 00:08 |只看该作者
原帖由 drangon 于 2009-11-21 15:59 发表


这属于工程问题了,命名规范,设计架构等方面,本来就不应该出现不同意义却重名的现象,与其找借口证明重名合理性还不如想办法去掉重名

命名规范的东西谁都懂,我是说这种东西为什么不是由编译器来报错,就像重复定义函数或变量一样,而是由程序员小心的处理或命名空间来处理

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
10 [报告]
发表于 2009-11-22 02:52 |只看该作者
因为Test1.c和Test2.c是分开编译的,编译Test1.C的时候编译器看不到Test2.c
同样的Test2.c编译时也看不到Test1.c

Gcc -c test1.c -o test1.o  #目标代码Test1.o,不会有Struct的信息.就算是int i;目标代码也不会知道这个i是Int的.只是Unsign INT和Sign Int计算时代码不同~
Gcc -c test2.2 -o test2.o #同上
Gcc test1.o test2.o test  #二进制代码中更不会有结构极变量的信息
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP