Typedef/struct声明

23
这两个声明有什么不同?如果有人能详细解释一下:
typedef struct atom {
  int element;
  struct atom *next;
};

typedef struct {
  int element;
  struct atom *next;
} atom;

检查以下两个链接 onetwo 的差异,第一个链接中的 typedef is redundant - Grijesh Chauhan
3
第一个无效。typedef 的整个意义在于给类型声明赋予一个新的名称,而你并没有为结构体类型指定任何名称。 - Barmar
@GrijeshChauhan 这种说法引发的问题比解决的问题还多。 - user2780061
@Barmar 我在C语言方面有点新手,如果您能更加“平易近人”地解释一下就好了。我理解typedef的意思是避免每次创建新结构体时都要输入struct关键字。我之前认为,在大括号前面带有名称的结构体指定了类型,在大括号后面带有名称的结构体指定了具有该名称的“变量”,我以为这也适用于typedef struct,显然我在某个地方犯了严重的思维错误。 - user2780061
为什么要使用@Barmar?这样做有什么多余的地方吗? - user129393192
为什么什么?我从来没有说过冗余,那是Grijesh Chauhan说的。@user129393192 - Barmar
3个回答

22

这是普通的 结构声明

  struct atom {
      int element;
      struct atom *next;
    };    //just declaration

创建 对象

 struct atom object; 

  struct atom {
      int element;
      struct atom *next;
    }object;    //creation of object along with structure declaration

而且

这是结构体 atom类型的定义

typedef  struct atom {
  int element;
  struct atom *next;
}atom_t;  //creating new type

这里的 atom_tstruct atom 的别名。

对象的创建

atom_t object;      
struct atom object; //both the ways are allowed and same

typedef 是一个关键字。它的目的是从更基本的机器类型中形成复杂的类型。请参阅此信息 typedef http://en.wikipedia.org/wiki/Typedef。 - Gangadhar

17

typedef 的目的是为了给类型规范命名。语法如下:

typedef <specification> <name>;

完成上述步骤后,您可以像使用语言内置类型一样使用<name>来声明变量。

在第一个示例中,<specification>是以struct atom开始的所有内容,但之后没有<name>。因此,您并未给类型规范指定新名称。

struct声明中使用名称并不意味着定义了新类型。如果要使用该名称,则始终必须在其前面加上struct关键字。因此,如果您声明:

struct atom {
    ...
};

你可以用以下方式声明新变量:

struct atom my_atom;

但你不能简单地声明

atom my_atom;

对于后者,你需要使用typedef

请注意,这是C和C++之间的一个显著区别。在C++中,声明structclass类型可以在变量声明中使用,不需要typedef。但在C++中,对于其他复杂类型结构(如函数指针),typedef仍然很有用。

你应该查看相关侧边栏中的一些问题,它们解释了这个主题的一些其他细节。


哦,这就解释了,它更与typedef相关,而不是与struct相关。还有一个问题:当两个地方都有一个单词时,怎么处理:codetypedef struct at { int element; struct at *next; } atom; - user2780061
1
这允许您使用struct atatom来声明变量。 - Barmar
这是唯一的目的吗? - user2780061
1
你需要给这个 struct 起一个名字,这样你才能在 next 链接中引用它,因为 typedef 在语句之后才被定义。 - Barmar
关于 typedef 和链表的问题,可以参考这个链接:https://dev59.com/FW865IYBdhLWcg3wFqrY - Barmar

1
typedef关键字的一般语法如下: typedef 现有数据类型 新数据类型;
typedef struct Record {
    char ename[30];
     int ssn;
    int deptno;
} employee;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接