在C++中,关键字struct和typedef struct都可以定义一个结构体,但是两者在使用中有所不同。
区别
主要在于定义结构体时,右花括号后的字段意义不同
1)struct定义结构体
struct ClassName {
...
}Instance;
此时,花括号后的字段Instance表示结构体ClassName的一个实例;
2)typedef struct定义结构体
typedef struct ClassName {
...
}OtherName;
c此时,花括号后的字段OtherName表示结构体ClassName的一个别名。
个人理解
使用typedef struct(上述第二种方式)定义结构体,实际上与以下代码等价
struct ClassName {
...
};
typedef struct ClassName OtherName;
即,声明一个结构体ClassName,然后将ClassName重新声明为一个新结构体OtherName。
避坑
- 使用关键字struct定义结构体,右花括号后的字段表示该结构体的一个实例,若声明时该字段与结构体名重复,则在使用该字段时编译器会认为使用的是该实例,而非结构体。
struct ClassName {
int var;
...
}ClassName;
int main() {
ClassName.var = 0; //编译通过
ClassName inst; //编译失败,认为ClassName不是一个类型或结构体
}
可以在c++中使用该性质实现单例模式。