当我在Visual C++中尝试这个时,为什么会出现错误?
struct S { };
typedef S *S;
Run Code Online (Sandbox Code Playgroud)
不是C++ 会给你typedef
一个以前只被声明为class
或者名字的名字struct
吗?
或者我误解了发生了什么?
C++允许您键入现有的类名,但只能以非常有限的方式.一旦你宣布struct S
你可以做到
typedef struct S S;
Run Code Online (Sandbox Code Playgroud)
但你做不到
typedef struct S *S; // ERROR
Run Code Online (Sandbox Code Playgroud)
要么
typedef int S; // ERROR
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,您重新定义S
为指针的事实是打破它的原因.
语言规范在7.1.3/2中说明
在给定的非类作用域中,可以使用typedef说明符重新定义该作用域中声明的任何类型的名称,以引用它已引用的类型.
"已经提到"是关键部分.简单来说,您可以将类名重新定义为代表相同的类类型,但不能指向类类型或其他任何类型的指针.
上面提到的C++标准部分也允许你编写重复的typedef
typedef int T;
typedef int T;
typedef int T;
Run Code Online (Sandbox Code Playgroud)
这在C中是非法的
归档时间: |
|
查看次数: |
8939 次 |
最近记录: |