繁体   English   中英

为什么我要重新定义? 不同的基本类型?

[英]Why am I getting redefinition; different basic types?

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

struct S { };
typedef S *S;

C ++不能让您typedef一个以前仅声明为classstruct吗?
还是我误会发生了什么?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM