免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wwdwwd
打印 上一主题 下一主题

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

论坛徽章:
0
21 [报告]
发表于 2009-11-26 11:34 |只看该作者
原帖由 flw 于 2009-11-26 11:03 发表

所以才需要 include 啊。
笨笨

^_^,他说的意思是即便include也没有,看来应该是编译器不支持这样的报错,而需要程序员手动控制

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
22 [报告]
发表于 2009-11-26 11:36 |只看该作者
原帖由 wwdwwd 于 2009-11-26 11:34 发表

^_^,他说的意思是即便include也没有,看来应该是编译器不支持这样的报错,而需要程序员手动控制

我说的是 include 就可以了。而不是【即便 include 也没用】

论坛徽章:
0
23 [报告]
发表于 2009-11-26 15:02 |只看该作者
原帖由 flw 于 2009-11-26 11:36 发表

我说的是 include 就可以了。而不是【即便 include 也没用】

我突然发现原因可能是这样的:为什么全局变量和全局函数要保持唯一,因为在链接的时候要进行重定位,如果有多个同名的全局变量定义的话,就意味着同一变量有多个地址,那么就没法重定位了,而对于结构体类型的定义则不需要重定位,因为它只是一种类型,只要在某一范围内别人知道它就行,这个范围是定义结构体的文件及include它的文件,而其他文件则是不知道的,如果在test3.c里面include test.c和test2.c的话就会报错了

论坛徽章:
0
24 [报告]
发表于 2009-11-26 22:40 |只看该作者
原帖由 folklore 于 2009-11-22 15:46 发表


这个是由代码实现的。。。实现和编译器有关。一种常用的实现是在Stack中Construct一个异常处理帧,出现异常时代码将Jmp到异常处理代码,而正常处理时,程序将走正常流程


此外,和Namespace无关。Names ...

为什么是跟namespace无关呢?
原帖的问题是在两个文件中定义了两个名字相同的结构体类型TSNODE,为什么链接时没有冲突,而如果把两个结构写在一起则会报错

分开写的那种,因为编译时是独立编译不同文件的,自然不会出问题
至于链接时,已经无须引用其类型信息了(已经是二进制代码了),那也不会报错

结构定义写到同一个文件中时,第二次TSNODE的定义会发现在它将起作用的namespace,或者说是作用域内已经存在一个TSNODE的定义了
那么就会出现一个重复定义的冲突
如果说是跟namespace无关,那么如何解释重复定义有时报错有时不报错呢?

论坛徽章:
0
25 [报告]
发表于 2009-11-26 22:45 |只看该作者

回复 #18 flw 的帖子

呵呵
不过俺觉得还是不应该报错,除非标准中有明确指出

我觉得原帖期待的是针对重复定义的报错,而重复定义只有在同一个namespace或者作用域中出现才报错
如果像原帖中那种出现在两个文件中的同一个struct名字要出warning的话
这种代码是不是也要给warning?

foo()
{
    int i;
}
bar()
{
    char i;
}


那就太疯狂拉

论坛徽章:
0
26 [报告]
发表于 2009-11-27 00:02 |只看该作者
原帖由 lemoncookie 于 2009-11-26 22:45 发表
呵呵
不过俺觉得还是不应该报错,除非标准中有明确指出

我觉得原帖期待的是针对重复定义的报错,而重复定义只有在同一个namespace或者作用域中出现才报错
如果像原帖中那种出现在两个文件中的同一个struct ...


请看一下,我上面的解释,看是否正确

论坛徽章:
0
27 [报告]
发表于 2009-11-27 09:34 |只看该作者
因为typedef是编译过程中解决的,编译完了就不存在了,你无法在一个c文件中去访问另一个c文件中的类型定义,当然也就不存在冲突的问题,这也正是我们通常要把类型定义放在.h文件中让程序来包含的原因

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
28 [报告]
发表于 2009-11-27 10:11 |只看该作者
原帖由 lemoncookie 于 2009-11-26 22:45 发表
呵呵
不过俺觉得还是不应该报错,除非标准中有明确指出

我觉得原帖期待的是针对重复定义的报错,而重复定义只有在同一个namespace或者作用域中出现才报错
如果像原帖中那种出现在两个文件中的同一个struct ...

照你这么说,
if ( a = 1 )
也不应该有警告了,除非标准中有明确指出。


呵呵。科技以人为本。

论坛徽章:
0
29 [报告]
发表于 2009-11-27 14:32 |只看该作者
原帖由 flw 于 2009-11-27 10:11 发表

照你这么说,
if ( a = 1 )
也不应该有警告了,除非标准中有明确指出。


呵呵。科技以人为本。


是滴,当然以人为本
但也不能说,谁对gcc有任何不满意的地方,就要求gcc去做到那一点吧,总得有个指导

具体到这个问题,其实gcc怎么做并不能就说是好的,是最终的最佳结果

比如写
if (p = malloc(size))

这是完全合法的,也很方便
那-Wall给的警告就给得多余了

-Wall是经过gcc自己扩展的,-pedantic则是针对ANSI C标准的警告
if (a = 1)用-pedantic编译时不会报警的

所以这种写法应不应该给警告,或者如何给警告都是可以变通的
像现在给的警告“suggest parentheses around assignment used as truth value”就有点不合适
比如加一对括号,写成if((a=1))就没有警告了,那我觉得这个还是应该给警告啊
而且这个suggestion给得不好,类似explicitly comparison expression expected可能更直观
不过,那样的话if(a)也要给警告了,呵呵

论坛徽章:
0
30 [报告]
发表于 2009-11-27 14:38 |只看该作者

回复 #26 wwdwwd 的帖子

我觉得你23楼的说法没什么问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP