[英]Creating a struct and a class with the same name
摘要 :如果您声明一个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 bar
使用了class foo
class bar
。 我认为与此同时,将声明class foo
的位置更改为struct bar
。 这就是为什么代码正在编译。 所以我想我的问题的答案是声明对象时struct
和class
是可互换的。 我仍然认为始终使用它们是一个好主意。
关键字struct
和class
在很大程度上可以互换。 即使编写struct Foo
,您也已经创建了一个名为Foo
的类类型。 并且该名称在其范围内必须是唯一的(出于C兼容性的原因而有特殊的例外,但最好忽略它)。
通常,所有标识符必须唯一。
特别是,在《 The C ++ Programming Language》一书的10.2.8节中,Bjarne Stroustrup指出:
根据定义,
struct
是一类,默认情况下成员是公共的。 那是struct s { ...
简而言之
class s { public:...
struct
和class
之间没有根本的区别 ; 前者仅仅是语法糖。
因此,即使您可以使用具有相同名称的标识符(同样,您也不能),但结构和类之间不会有任何区别,因为它们是完全相同的东西。
无论定义的是类还是结构,标识符都必须是唯一的。
我会以@Alex Chamberlain和@James Kanze的评论为答案:
代码没有问题,因为声明!= definition :您可以将类型声明为class
, struct
或union
,然后使用其他类型进行定义。 多个定义不应该编译; 但是,多个声明就可以了。
真正的问题:转发声明时,您不必关心它是结构,类还是联合:在这种情况下,这是无关紧要的实现细节,以后甚至可能更改。 因此,此警告是人为的代码气味。 不过,您必须选择并考虑class foo;
已经成为转发声明的方式 ,我会说代码很完美 。
作者没有忘记更新前瞻性声明。 他不应该这样做 (无论他是否更改了实现,他都可能没有这么做)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.