在C++中,以下各项之间是否存在差异:
struct Foo{…};
以及:
typedef结构{…}Foo;
在C++中,只有细微的差别。这是C语言的一种保留,在C语言中,它起到了不同的作用
C语言标准(C89§3.1.2.3、C99§6.2.3和C11§6.2.3)要求为不同类别的标识符使用不同的名称空间,包括标记标识符(用于struct/union/enum)和普通标识符(用于typedef和其他标识符)
如果你刚才说:
struct Foo{…};
富x;
您将得到一个编译器错误,因为Foo仅在标记名称空间中定义
您必须将其声明为:
struct Foo x;
任何时候你想引用一个Foo,你总是必须称它为struct Foo。这会很快变得烦人,因此您可以添加typedef:
struct Foo{…};
typedef结构Foo-Foo;
现在struct Foo(在标记名称空间中)和普通Foo(在普通标识符名称空间中)都引用相同的内容,并且您可以自由声明类型为Foo的对象,而不必使用struct关键字
结构:
typedef结构Foo{…}Foo;
只是声明和typedef的缩写
最后,
typedef结构{…}Foo;
声明匿名结构并为其创建typedef。因此,使用此构造,它在标记命名空间中没有名称,只有在typedef命名空间中有名称。这意味着它也不能被向前声明如果要进行转发声明,必须在标记命名空间中为其指定名称
在C++中,所有的结构> /COD> >代码>联合 >代码> EnUM >代码>类声明,它们的作用是隐式 TyPufF ED,只要名称不被另一个具有相同名称的声明所隐藏。有关详细信息,请参见Michael Burr的答案