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

时间:2012-12-02 22:01:48

标签: c++ visual-c++

为什么我在Visual C ++中尝试这个时出错?

struct S { };
typedef S *S;

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

3 个答案:

答案 0 :(得分: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中是非法的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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