What is the difference when using typdef when declaring a struct?
Possible Duplicates:
Why should we typedef a struct so often in C?
Difference between ‘struct’ and ‘typedef struct’ in C++?
以下类型声明之间的区别是什么?
1 2 3 4 5 6 7 8 9 10 | struct Person { int age; }; typedef struct { int age; }Person; |
我明白
1 2 3 4 | struct { int age; }Person; |
创建名为person的未命名结构的实例,其中
1 2 3 4 | struct Person { int age; }; |
声明名为Person的类型,但不声明实例。但我还是不明白typedef的作用。
我认为这与在C中一样,typedef创建了一个类型的别名…在第一种情况下,类型的名称是"EDOCX1"(0),而在第二种情况下则是"EDOCX1"(1)。
通常,当必须声明自引用结构(如列表)时,可以同时使用这两者,因为typedef在定义结构之前(除非进行正向声明)不会生效,例如:
1 2 3 4 | typedef struct node { void *data; struct node *next; } TNode, *PTNode; |
因此,现在可以用以下方法声明相同类型的变量:
1 2 3 | struct node *node1; TNode *node2; PTNode node3; |
上面的三个变量是相同的,指向节点结构。
在C语言中,结构位于它们自己的名称空间中,因此如果要使用结构的类型名,则必须编写
在C++中,Struts与其他所有的对象都在同一个名称空间中,所以没有必要这样做。它通常被视为不必要的C-ism。
这里解释C中结构的typedef用法。(在C++中,Struts只是默认的公共成员,而默认情况下,类成员是私有的)
在C++中,Type DEFS是其他类型的同义词,而不是不同的类型。它们通常用于两个目的:
创建可移植代码,从中抽象出特定平台。在一个平台上可以有
typedef int int32 ,在另一个平台上可以有typedef long int32 。您将在整个代码中使用int32 ,当移植到新平台时,只需修改typedef以满足您的需求。为非常复杂的类型创建别名。如
typedef char const* const* cppchar 。现在可以编写cppchar ,而不是在代码中编写char const* const* 。
当将person或struct person传递给函数时,可以区分
如果你定义
1 | struct Person { ... }; |
您应该将它传递给一个显式声明它是一个结构的函数
1 | void foo(struct Person person) { ... } |
另一方面,如果你定义了
1 | typedef struct Person { ... }; |
不能声明它是结构,因为关键字typedef允许您实际定义数据类型,在本例中,person和您通过这种方式传递它
1 | void foo(Person person) { ... } |
与其他数据类型非常相似
希望这有帮助
C相容性C++中基本相同,有传统C代码
当您这样做定义时,不确定是否引用未命名结构中的静态函数和typedef—我从不这样做。