1

摘要:如果您声明 astruct和 aclass具有相同的名称会发生​​什么。

详情

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

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 fooin a 。class bar我认为与此同时,class foo声明的地方已更改为struct bar. 这就是编译代码的原因。所以我想我的问题的答案是,structclass声明对象时是可以互换的。我仍然认为始终如一地使用它们是个好主意。

4

4 回答 4

7

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

于 2013-04-25T16:58:59.753 回答
3

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

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

根据定义,astruct是一个成员默认为公共的类;那是

struct s { ... 

只是简写

class s { public:...

和之间没有潜在的区别;前者只是语法糖。structclass

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

于 2013-04-25T18:21:27.967 回答
1

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

于 2013-04-25T16:58:40.147 回答
1

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

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

真正的问题:当您转发声明时,您不想关心它是结构、类还是联合:在这种情况下,这是一个不相关的实现细节,甚至可能在以后发生变化。所以这个警告是人为的代码气味。不过,您必须选择,并且考虑到这class foo;已成为转发声明的方式,我什至可以说代码是完美的

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

于 2017-06-07T09:09:17.260 回答