C中这两个声明之间有什么区别:
typedef struct square{
//Some fields
};
和
typedef struct{
//Some fields
} square;
答案 0 :(得分:10)
第一个声明:
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
定义恰好合并为一个声明。
答案 1 :(得分:2)
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 */
所以在这里,你将enum重命名为boolean。
所以当你写
typedef struct X {
//some field
} X;
您将类型struct X重命名为X.当我说重命名时,它更像是另一个名字。
提示,您可以简单地写一下:
typedef struct {
//some field
} X;
但是如果你需要一个具有相同类型的字段(比如在链表中),你必须给你的结构命名
typedef struct X {
X *next; /* will not work */
struct X *next; /* ok */
} X;
希望这会有所帮助:)
编辑: 正如Keith Thompson所说,typdef旨在创建别名:)