2010-06-22 68 views
1

foo.c的重复结构定义

struct foo { 
    int a; 
}; 

bar.c 

struct foo { 
    char *s; 
    double x,y; 
}; 

的结构定义只在.c文件。根据C标准是否合法?标准的哪一部分如此说明? 编辑:没有#include结构定义。

谢谢大家的快速响应! :D

回答

6

该代码完全合法C.您可能会遇到调试器问题(将一种类型误认为另一种类型,试图将其中一种显示为另一种类型),但从语言的角度来看,这样做很好。

没有标准的任何部分可以直接说这是合法的。相反,没有任何标准说明它是非法的。

因为C++将链接的概念扩展为类,而C++类中的非本地链接始终具有外部链接,所以类似这样的内容在C++中将是非法的。

+0

对第二段没有把握。没有什么说我不能在我的代码中放大象;) – sje397 2010-07-19 17:12:53

+0

@ sje397:是的,但标准甚至没有引入“大象”的概念。至于结构类型 - 它们存在于标准中,并且结构的声明规则也在标准中描述。该标准说明了在程序中使用结构类型需要做些什么,只要满足这些要求,您就可以。 – AnT 2010-07-19 18:22:38

+0

基本上,它就像是问你将结构类型命名为“Abcdef”是否合法。你会如何回答这样的问题?如果你只是说“是”,那么接下来的问题将是'Dgefht'作为一个结构类型名称。这个好吗?等等......所以,当涉及到这样的问题时,正确的答案是,如果标准不禁止这样的标识符,那么使用它就可以。与原始问题中的结构声明一样。 – AnT 2010-07-19 18:25:21

6

C99标准的第6.2.1-4节指出它是合法的,因为它们都在不同的范围内声明(每个文件的文件范围从其定义延伸到翻译单元的末尾,即文件)。

+0

但是,联动表示可以使来自不同范围的两个标识符引用同一个对象。在这种情况下他们俩是不是都有外部联系? – 2010-06-22 14:35:24

+0

我读了6.2.2-6,指出缺省情况下,结构体没有链接(一个结构体不是对象) – sje397 2010-06-22 14:45:28

+1

@Owen S:在C语言中,* linkage *的概念不适用于* types *。在C链接中仅适用于对象或函数。 – AnT 2010-06-22 14:49:00