[英]What is 'forward declaration' and the difference between 'typedef struct X' and 'struct X'?
[英]What's the difference between `typedef struct X { }` and `typedef struct { } X`?
C中这两个声明之间有什么区别:
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
定义碰巧组合成一个声明。
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旨在创建别名:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.