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

时间:2014-11-03 22:39:19

标签: c struct typedef

C中这两个声明之间有什么区别:

typedef struct square{

   //Some fields

};

typedef struct{  

           //Some fields

} square;

2 个答案:

答案 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旨在创建别名:)