什么在C这两个声明之间的区别:`typedef struct X {}`和`typedef struct {} X`有什么区别?
typedef struct square{
//Some fields
};
和
typedef struct{
//Some fields
} square;
什么在C这两个声明之间的区别:`typedef struct X {}`和`typedef struct {} X`有什么区别?
typedef struct square{
//Some fields
};
和
typedef struct{
//Some fields
} square;
第一个声明:
typedef struct square {
// Some fields
};
定义了一个名为struct square
类型。 typedef
关键字是多余的(感谢HolyBlackCat用于指出)。它等同于:
struct square {
//Some fields
};
(您可以使用在声明中typedef
关键字没有定义类型名称,这一事实在C的语法毛刺。)
这第一个声明可能应该已经:
typedef struct square {
// Some fields
} square;
第二个声明:
typedef struct {
// Some fields
} square;
定义了一个匿名struct
类型,然后给它别名square
。
请记住,typedef
本身并没有定义一个新类型,只是一个现有类型的新名称。在这种情况下,typedef
和(匿名)struct
定义恰好合并为一个声明。
另外,在第一种情况下'typedef'是多余的,什么都不做。 – HolyBlackCat 2014-11-03 22:47:10
@HolyBlackCat:我完全错过了。谢谢。 – 2014-11-03 22:53:52
谢谢!真的帮了! – PlayHardGoPro 2014-11-03 22:57:02
struct X { /* ... */ };
创建一个新的类型。所以,你可以通过
struct X myvar = {...}
或
struct X *myvar = malloc(sizeof *myvar);
typdef声明这个新类型旨在所以这里命名型
typedef enum { false, true } boolean;
boolean b = true; /* Yeah, C ANSI doesn't provide false/true keyword */
,重命名的枚举布尔值。
所以,当你写
typedef struct X {
//some field
} X;
当我说重命名,它更多的其他名称重命名类型结构X到十。
提示,你可以简单的写:
typedef struct {
//some field
} X;
但是,如果你(在链表等)需要一个字段与同类型,你必须提供一个名称你的结构
typedef struct X {
X *next; /* will not work */
struct X *next; /* ok */
} X;
希望这有助于:)
编辑: 基思·汤普森说,typdef旨在创建别名:)
我知道,我的结构中有一些字段,我只需要知道结构底部和顶部名称的区别... – PlayHardGoPro 2014-11-03 22:42:33
[为什么我们应该在C中经常键入一个结构?] (http://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c) – Raedwald 2016-10-17 15:48:01