为什么我要重新定义;不同的基本类型?
为什么我在Visual C++中尝试这个时会出错?为什么我要重新定义;不同的基本类型?
struct S { };
typedef S *S;
不是C++ let you typedef
a name that was previously only declared as a class
or struct
?
还是我误解发生了什么?
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.是非法
哦,所有它允许的是一个冗余的声明......有趣的,谢谢+1 – Mehrdad
@Mehrdad请注意,在C2011中允许重复相同的typedef 6.7(3) :“一个typedef名称可能被重新定义为表示与当前相同的类型,只要该类型不是可变修改类型;”(除了可变修改类型)。 –
您正试图定义与“S”(结构名称)冲突的S(typedef)。
这在C中是可以的,因为结构体名称不会与类型名称冲突 - 结构体名称将是struct S
,而类型名称只是S
。但是,在C++中,所有名称都被认为来自同一个名称池,所以在您的示例中这两个名称会发生冲突。
这将在C语言中,但不允许在C++。在C++中,'struct S {...};'大致等同于'typedef struct S {...} S;'在C中(即之后,您可以用'S x定义一个'S'的实例;',不需要'struct S x;'。 –