C结构与typedef结构问题

时间:2011-08-04 05:41:58

标签: c struct typedef

所以我的问题是多方面的。

为了理解C(不是C ++),我相信以下代码:

struct Foo { int bar; }; 

创建一个我可以使用的自定义类型,但这样做:

typedef Foo { int bar; };

我看到的唯一区别是我是否必须在Foo类型的变量之前使用“struct”关键字。造成这种行为的区别是什么?

4 个答案:

答案 0 :(得分:6)

区别在于:

struct Foo { int bar; }; 

创建名为Foo的结构类型{ int bar; }。即完整类型名称为struct Foo

typedef Foo { int bar; };

为未命名的结构类型Foo

创建别名{ int bar; }

但是我不确定你的语法对于严格的C是完全正确的,但是对于你的编译器来说它可以。或者它创建了不同的东西,但偶然它起作用,C语法可能非常棘手。无论如何第二个陈述应该是:

typedef struct { int bar; } Foo;

进一步参考you can use this

答案 1 :(得分:6)

struct引入了一种新类型,但typedef只是为另一种类型创建别名。此声明创建一个名为struct Foo的新类型:

struct Foo { int bar; }; 

此声明无效:

typedef Foo { int bar; };

但是,此声明有效,并创建一个新的未命名类型,并为该类型创建一个名为Foo的别名:

typedef struct { int bar; } Foo;

您还可以为命名类型创建别名 - 这会为名为struct Foo的{​​{1}}类型创建别名:

Foo

这两个名称是完全可互换的 - 例如,您可以将typedef struct Foo Foo; 传递给声明为带有struct Foo类型参数的函数。

您可以为任何类型创建别名,包括内置类型。例如,您可以为名为Foo的{​​{1}}创建别名:

int

答案 2 :(得分:1)

我相信你的语法不正确。 typedef Foo { int bar; };应为typedef Foo { int bar; } MyFoo;

人们之后会使用typedef的原因是他们可以在声明中删除结构。即:

struct Foo myFoo;
//vs.
MyFoo myFoo;

答案 3 :(得分:0)

当我要编译这段代码时

typedef Foo { int bar; };

它说编译错误

error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token