2

为什么我在 Visual C++ 中尝试此操作时会出现错误?

struct S { };
typedef S *S;

C++不让您typedef使用以前仅声明为classorstruct的名称吗?
还是我误解了发生了什么?

4

3 回答 3

5

C++ 确实允许您对现有的类名进行 typedef,但只能以非常受限的方式。一旦你宣布struct S你可以做

typedef struct S S;

但你不能做

typedef struct S *S; // ERROR

或者

typedef int S; // ERROR

在第一种情况下,您重新定义S指针的事实是破坏它的原因。

语言规范在 7.1.3/2 中说

在给定的非类作用域中,typedef 说明符可用于重新定义在该作用域中声明的任何类型的名称,以引用它已经引用的类型。

“已经引用”是关键部分。简而言之,您可以重新定义类名以代表相同的类类型,但不能代表指向该类类型的指针或其他任何东西。


前面提到的 C++ 标准部分也允许您编写重复的 typedef,例如

typedef int T;
typedef int T;
typedef int T;

这在 C 中是非法的。

于 2012-12-02T22:16:09.837 回答
1

这在 C 中是可以的,因为结构名称不会与类型名称冲突 - 结构名称是struct S,类型名称是 just S。但是,在 C++ 中,所有名称都被认为来自同一个名称池,因此示例中的两个名称会发生​​冲突。

于 2012-12-02T22:09:27.570 回答
0

您正在尝试定义与“S”(结构名称)冲突的 S(typedef)。

于 2012-12-02T22:06:23.257 回答