所以我的问题是多方面的。
为了理解C(不是C ++),我相信以下代码:
struct Foo { int bar; };
创建一个我可以使用的自定义类型,但这样做:
typedef Foo { int bar; };
我看到的唯一区别是我是否必须在Foo类型的变量之前使用“struct”关键字。造成这种行为的区别是什么?
答案 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