为什么我被重新定义;不同的基本类型

Why am I getting redefinition; different basic types?

本文关键字:类型 定义 新定义 为什么      更新时间:2023-10-16

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

struct S { };
typedef S *S;

C++不让你typedef以前只声明为classstruct的名字吗?
还是我误解了发生了什么?

C++确实允许您键入定义现有的类名,但只能以非常受限的方式进行。一旦你申报了你的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 中是非法的。

这在

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

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