繁体   English   中英

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

[英]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 这就是为什么代码正在编译。 所以我想我的问题的答案是声明对象时structclass是可互换的。 我仍然认为始终使用它们是一个好主意。

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

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

特别是,在《 The C ++ Programming Language》一书的10.2.8节中,Bjarne Stroustrup指出:

根据定义, struct是一类,默认情况下成员是公共的。 那是

 struct s { ... 

简而言之

 class s { public:... 

structclass之间没有根本的区别 ; 前者仅仅是语法糖。

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

无论定义的是类还是结构,标识符都必须是唯一的。

我会以@Alex Chamberlain和@James Kanze的评论为答案:

代码没有问题,因为声明!= definition :您可以将类型声明为classstructunion ,然后使用其他类型进行定义。 多个定义不应该编译; 但是,多个声明就可以了。

真正的问题:转发声明时,您不必关心它是结构,类还是联合:在这种情况下,这是无关紧要的实现细节,以后甚至可能更改。 因此,此警告是人为的代码气味。 不过,您必须选择并考虑class foo; 已经成为转发声明的方式 ,我会说代码很完美

作者没有忘记更新前瞻性声明。 他不应该这样做 (无论他是否更改了实现,他都可能没有这么做)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM