[英]Why am I getting redefinition; different basic types?
在Visual C ++中尝试此操作时为什么会出现错误?
struct S { };
typedef S *S;
C ++不能让您typedef
一个以前仅声明为class
或struct
吗?
还是我误会发生了什么?
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中是非法的
这在C语言中是可以的,因为结构名称不会与类型名称冲突-结构名称将为struct S
而类型名称仅为S
但是,在C ++中,所有名称都被认为来自同一名称池,因此示例中的两个名称将发生冲突。
您试图定义与“ S”(结构名称)冲突的S(类型定义)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.