创建具有相同名称的结构和类

时间:2013-04-25 16:56:53

标签: c++

摘要:如果您声明structclass具有相同名称,会发生什么。

详情

我正在审核一些代码,我看到了这样的警告:

warning: struct 'foo' was previously declared as a class

当用clang编译时,还有几个地方clang添加了注释:

foo.h:29:1: note: did you mean struct here?
class foo;
^~~~~
struct

显然,拥有一个结构和一个具有相同名称的类不是一个好的编码实践。看起来发生的事情是开发人员正在编写他自己的类,并使用了一个已经在他所包含的另一个文件中使用的名称,他没有注意到。

但是,我的问题是编译器是否能够区分声明为class foo的变量与struct foo变量之间的差异?

修改

实际上发生的事情是开发人员正在使用他创建的class foo中的class bar。我认为在此期间class foo被宣布的位置已更改为struct bar。这就是代码编译的原因。所以我想我的问题的答案是structclass在声明对象时是可以互换的。我仍然认为一直使用它们是个好主意。

4 个答案:

答案 0 :(得分:7)

关键字structclass在很大程度上是可以互换的。 即使您编写struct Foo,也创建了类型 名称为Foo。并且该名称在其中必须是唯一的 范围(由于C兼容性的原因有特殊例外, 但最好忽略它。

答案 1 :(得分:2)

通常,所有标识符都必须是唯一的。

特别是,在“The C ++ Programming Language”一书的第10.2.8节中,Bjarne Stroustrup声明:

  

根据定义,struct是一个成员公开的类   默认;

struct s { ... 
     

只是

的简写
class s { public:...

structclass之间没有潜在差异;前者仅仅是语法糖。

因此,即使您可以使用相同名称的标识符(同样,您也不能),结构和类之间没有任何区别,因为它们完全相同。

答案 2 :(得分:1)

标识符必须是唯一的,无论您定义类或结构如何。

答案 3 :(得分:0)

我会把@Alex张伯伦和@James Kanze的评论作为答案:

代码没有任何问题,因为声明!=定义:您可以将类型声明为classstructunion然后使用定义的另一个。多个定义不应该编译;然而,多个声明就可以了。

真正的问题:当您转发声明时,您不想关心它是结构,类还是联合:在该上下文中,这是一个不相关的实现细节,甚至可能在以后更改。所以这个警告是一种人为的代码味道。不过,你必须选择,并且考虑到class foo;已成为前进声明的方式,我会尽量说代码是完美的

作者没有忘记更新前向声明;他不应该(他是否改变了实施,他可能没有)。