在声明结构时使用typedef有什么区别?

时间:2009-07-22 17:06:15

标签: c++ struct typedef

  

可能重复:
  Why should we typedef a struct so often in C?
  Difference between ‘struct’ and ‘typedef struct’ in C++?

以下类型声明有什么区别?

struct Person
{
    int age;
};


typedef struct 
{
    int age;
}Person;

我理解

struct 
{
    int age;
}Person;

创建名为person的未命名结构的实例,其中

struct Person
{
    int age;
};

声明一个名为person的类型,但不是实例。但是我仍然没有得到typedef的功能。

6 个答案:

答案 0 :(得分:4)

我认为这与C中的相同,typedef创建了一个类型的别名...在第一种情况下,类型的名称是“struct Person”,而在第二种情况下只是“{ {1}}”。

通常,当您必须声明自引用结构(如列表)时,您同时使用两者,因为typedef在定义结构之前不会生效(除非您进行前向声明),例如:

Person

现在您可以通过以下方式声明相同类型的变量:

typedef struct node {
    void *data;
    struct node *next;
} TNode, *PTNode;

上面的三个变量是相同的,指向节点结构的指针。

答案 1 :(得分:2)

解释了在{C}中对结构使用typedef here。 (在C ++中,结构只是具有默认公共成员的类,而默认情况下类成员是私有的)

答案 2 :(得分:2)

在C中,结构体存在于它们自己的名称空间中,因此如果要使用结构体的类型名称,则必须编写struct Persontypedef消除了对该前缀的需要。

在C ++中,结构与其他所有结构都存在于同一名称空间中,因此不需要这样做。它通常被视为不必要的C-ism。

答案 3 :(得分:0)

C-兼容性 在c ++中基本相同,那里有传统的c代码

当你以这种方式进行定义时,不确定在未命名的struct中引用静态函数和typedef - 我从来没有这样做。

答案 4 :(得分:0)

将Person或struct Person传递给函数

时可以区分

如果你定义了

struct Person { ... };

您应该将它传递给明确声明它是结构

的函数
void foo(struct Person person) { ... }

另一方面,如果你定义了

typedef struct Person { ... };

你不能声明它是一个结构,因为关键字typedef允许你实际定义一个数据类型,在这种情况下是Person并且你以这种方式传递它

void foo(Person person) { ... }

非常像其他任何数据类型

希望这有帮助

答案 5 :(得分:0)

在C ++中, typedefs 是其他类型的同义词,而不是不同类型。它们通常用于两个目的:

  • 创建可移植代码,您可以在其中抽象出具体的平台。在一个平台上,您可以typedef int int32和另一个平台typedef long int32。您可以在整个代码中使用int32,当移植到新平台时,您只需要修改typedef以符合您的要求。

  • 为非常复杂的类型创建别名。例如。 typedef char const* const* cppchar。您现在可以编写char const* const*

  • ,而不是在代码中编写cppchar