关于c ++:在声明结构时使用typedef有什么区别?

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语言中,结构位于它们自己的名称空间中,因此如果要使用结构的类型名,则必须编写struct Persontypedef消除了对该前缀的需要。

在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—我从不这样做。