2014-11-03 57 views
5

什么在C这两个声明之间的区别:`typedef struct X {}`和`typedef struct {} X`有什么区别?

typedef struct square{ 

    //Some fields 

}; 

typedef struct{ 

      //Some fields 

} square; 
+0

我知道,我的结构中有一些字段,我只需要知道结构底部和顶部名称的区别... – PlayHardGoPro 2014-11-03 22:42:33

+0

[为什么我们应该在C中经常键入一个结构?] (http://stackoverflow.com/questions/252780/why-should-we-typedef-a-struct-so-often-in-c) – Raedwald 2016-10-17 15:48:01

回答

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定义恰好合并为一个声明。

+3

另外,在第一种情况下'typedef'是多余的,什么都不做。 – HolyBlackCat 2014-11-03 22:47:10

+0

@HolyBlackCat:我完全错过了。谢谢。 – 2014-11-03 22:53:52

+0

谢谢!真的帮了! – PlayHardGoPro 2014-11-03 22:57:02

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 */ 

,重命名的枚举布尔值。

所以,当你写

typedef struct X { 
    //some field 
} X; 

当我说重命名,它更多的其他名称重命名类型结构X到十。

提示,你可以简单的写:

typedef struct { 
    //some field 
} X; 

但是,如果你(在链表等)需要一个字段与同类型,你必须提供一个名称你的结构

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

希望这有助于:)

编辑: 基思·汤普森说,typdef旨在创建别名:)

相关问题