2012-12-02 54 views
2

为什么我在Visual C++中尝试这个时会出错?为什么我要重新定义;不同的基本类型?

struct S { }; 
typedef S *S; 

不是C++ let you typedef a name that was previously only declared as a class or struct
还是我误解发生了什么?

+0

这将在C语言中,但不允许在C++。在C++中,'struct S {...};'大致等同于'typedef struct S {...} S;'在C中(即之后,您可以用'S x定义一个'S'的实例;',不需要'struct S x;'。 –

回答

5

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.是非法

+0

哦,所有它允许的是一个冗余的声明......有趣的,谢谢+1 – Mehrdad

+1

@Mehrdad请注意,在C2011中允许重复相同的typedef 6.7(3) :“一个typedef名称可能被重新定义为表示与当前相同的类型,只要该类型不是可变修改类型;”(除了可变修改类型)。 –

0

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

1

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

相关问题