2

可能重复:
C++ 中“struct”和“typedef struct”之间的区别?

这个问题的答案让我想知道以下几点:

我假设定义一个类如下:

typedef class {int i;} C;

将完全等同于以传统方式定义它:

class C
{
   int i;
};

这个假设正确吗?

4

5 回答 5

4

在这个孤立的例子中,它们在功能上是相同的,至少从外部来看是相同的。

但是也有区别。特别是一个实例,您不能以这种方式声明 astruct或 a的构造函数class,仅仅因为class未命名。同样,您不能声明任何涉及类名的函数。这里有些例子:

typedef class
{
public:
  Gizmo() : n_(42) {}; // NOT OK
  ~Gizmo();
  Gizmo& operator<<(int n);    
private:
  int n_;
} Gizmo;

您也不能转发声明匿名类:

class Gizmo;

在 C++ 中,我从未见过typedef使用匿名struct或 aclass比简单地声明命名的 aclass或a 更可取的情况。struct在某些情况下,传统方法绝对是首选。这个故事的寓意是:不要typedef class {} Name;在 C++ 中使用。它什么也没有给你买,却让你付出了一些代价。

于 2012-10-30T12:53:41.873 回答
2

从实际的角度来看是的,因为标准说 (9.1/5)

命名类类型或其 cv 限定版本的 typedef-name (7.1.3) 也是 > 类名。如果在需要类名的地方使用命名 cv 限定类类型的 typedef-name,则忽略 cv 限定符。

7.1/3 说:

使用 typedef 说明符声明的名称成为 typedef-name。在其声明的范围内,typedef-name 在语法上等同于关键字,并以第 8 节中描述的方式命名与标识符相关联的类型。因此 typedef-name 是另一种类型的同义词。

从理论上讲不是,因为您可以(实际上我看到人们已经拥有)根据使用的版本起草有效或无效的程序,因为 7.1/3 继续从我切断它的地方说:

typedef-name 不会像类声明 (9.1) 或枚举声明那样引入新类型。

于 2012-10-30T12:46:51.880 回答
2

我相信这是一个重复的问题(找不到),但如果不是,请注意编译:

class C
{
   int i;
};
void C() {}

class C x;

虽然这不会:

typedef class
{
   int i;
} C;
void C() {}

C x;

名称空间不同。

于 2012-10-30T12:49:45.253 回答
0

它们不是等价的。尤其,

int main()
{
    class C c;
}

只会编译两个定义之一。

于 2012-10-30T12:49:41.513 回答
0

这是另一个区别:后者可以前向声明,前者不能。

于 2012-10-30T12:54:26.473 回答