The structure of a struct?
Possible Duplicate:
Difference between 'struct' and 'typedef struct' in C++?
有人能解释一下以下结构定义之间的区别吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | typedef struct { }GOOD; & struct GOOD { }; & typedef struct tagGOOD { }GOOD; |
我的老师用了最后一个例子,但我真的不知道为什么他在结构名上使用了一个"标记"(如果它是名称),有人能说清楚吗?
在我多年来阅读的所有代码中,我都看到了使用的所有这些变体。我刚刚登记了VS2010,它们似乎是等效的。我可以告诉你的是,TyPulf关键字在C中是必需的,但是不再是C++中的。
在C和C++中,用一个名称声明的任何EDCOX1(0)都可以被称为EDCOX1(1)。您还可以声明没有名称的匿名结构,如第一个示例中所做的那样。
任何类型都可以是
这三个选项都是合法的,使用哪一个是风格问题。
如果你在谈论C++,我相信TyPufF并不是真正需要的。事实上,这个故事来自C。
在C中,当我声明
1 2 3 | struct GOOD_STRUCT { ... } |
当我想要声明这个结构的变量时,我需要这样做
1 | struct GOOD_STRUCT good; |
为了获得更好的编码风格和可读性,人们习惯于在以下内容上进行typedef:
1 | typedef GOOD_STRUCT GOOD; |
所以你可以这样做
1 | GOOD good; |
为了把两者结合起来,人们过去常常这样做
1 2 3 | typedef struct GOOD_STRUCT { ... } GOOD; |
或
1 2 3 | typedef struct { ... } GOOD; |
然而,在C++中,不再需要它了。申报
结构应该有一个名称:
1 2 3 | struct StructName { // stuff }; |
typedef接受一个类型并给它一个名称:
1 | typedef SomeType NameYouWannaGiveThatType; |
第三个例子结合了这些。
这个例子是一个未命名的结构,一些编译器对此感到不安。
第二个例子是命名结构,但是传统上,如果不包含单词struct,就不能引用它。如
1 2 3 4 5 6 | struct MyStruct { //... }; MyStruct iffy; // Not allowed in C, in my experience anyway struct MyStruct good; // No problem. |
我还没有发现这是C++中的一个问题,但我确信有些人在后面知道C++规范,会给你一个更好的答案。总之,你可以用typedef绕过这个问题。
1 2 3 | typedef MyStruct { /* etc */ } MyStruct; MyStruct s; |
就个人而言,这可能只是一个风格问题,我不喜欢使用相同的名字:
1 | typedef MyStruct { /* etc */ } SMyStruct; |
定义1:
定义一个匿名(空)结构,并给它一个
定义2:
定义名为
定义3:
定义名为
根据我的经验,定义3在C代码中最常见。人们往往不太喜欢匿名结构,所以他们给结构起了一个名字,但他们也不喜欢在引用类型时使用