`typedef struct X { }` 和 `typedef struct { } X` 之间有什么区别?

5
这两个C语言声明有什么区别:
typedef struct square{

   //Some fields

};

并且

typedef struct{  

           //Some fields

} square;

我知道,我的结构体中有一些字段,我只需要知道结构体底部和顶部名称的区别即可... - PlayHardGoPro
2个回答

10

第一个声明:

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定义合并成单个声明。


2
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;

你将类型结构体X重命名为X。当我说重命名时,更多的是换了一个名字。
提示:你可以简单地写成:
typedef struct {
    //some field
} X;

但如果您需要一个与之前相同类型的字段(例如在链表中),您必须为您的结构体命名。

typedef struct X {
    X *next; /* will not work */
    struct X *next; /* ok */
} X;

希望这可以帮到您:)
编辑: 正如Keith Thompson所说,typedef旨在创建别名 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接