这两个C语言声明有什么区别:
typedef struct square{
//Some fields
};
并且
typedef struct{
//Some fields
} square;
第一个声明:
typedef struct square {
// Some fields
};
定义了一个名为struct square
的类型。 typedef
关键字是多余的(感谢HolyBlackCat指出)。这相当于:
定义了一个名为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
定义合并成单个声明。
struct X { /* ... */ };
struct X myvar = {...}
struct X *myvar = malloc(sizeof *myvar);
typedef旨在给一个类型命名
typedef enum { false, true } boolean;
boolean b = true; /* Yeah, C ANSI doesn't provide false/true keyword */
您在这里将枚举重命名为布尔类型。
因此,当您编写以下代码时
typedef struct X {
//some field
} X;
typedef struct {
//some field
} X;
但如果您需要一个与之前相同类型的字段(例如在链表中),您必须为您的结构体命名。
typedef struct X {
X *next; /* will not work */
struct X *next; /* ok */
} X;