摘要:如果您声明struct
和class
具有相同名称,会发生什么。
详情:
我正在审核一些代码,我看到了这样的警告:
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
。这就是代码编译的原因。所以我想我的问题的答案是struct
和class
在声明对象时是可以互换的。我仍然认为一直使用它们是个好主意。
答案 0 :(得分:7)
关键字struct
和class
在很大程度上是可以互换的。
即使您编写struct Foo
,也创建了类类型
名称为Foo
。并且该名称在其中必须是唯一的
范围(由于C兼容性的原因有特殊例外,
但最好忽略它。
答案 1 :(得分:2)
通常,所有标识符都必须是唯一的。
特别是,在“The C ++ Programming Language”一书的第10.2.8节中,Bjarne Stroustrup声明:
根据定义,
struct
是一个成员公开的类 默认;struct s { ...
只是
的简写class s { public:...
struct
和class
之间没有潜在差异;前者仅仅是语法糖。
因此,即使您可以使用相同名称的标识符(同样,您也不能),结构和类之间没有任何区别,因为它们完全相同。
答案 2 :(得分:1)
标识符必须是唯一的,无论您定义类或结构如何。
答案 3 :(得分:0)
我会把@Alex张伯伦和@James Kanze的评论作为答案:
代码没有任何问题,因为声明!=定义:您可以将类型声明为class
,struct
或union
然后使用定义的另一个。多个定义不应该编译;然而,多个声明就可以了。
真正的问题:当您转发声明时,您不想关心它是结构,类还是联合:在该上下文中,这是一个不相关的实现细节,甚至可能在以后更改。所以这个警告是一种人为的代码味道。不过,你必须选择,并且考虑到class foo;
已成为前进声明的方式,我会尽量说代码是完美的
作者没有忘记更新前向声明;他不应该(他是否改变了实施,他可能没有)。