C typedef结构中定义之前的Name的用途

时间:2013-11-13 22:46:04

标签: c struct typedef

typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;

我遇到了上面的例子,我只能使用Book来定义对象,并且使用Books提供未知类型。我明白我可以完全没有Books,那么首先拥有它的目的是什么?

4 个答案:

答案 0 :(得分:1)

使用图书会提供未知类型

这很好 。根据C编程的当前趋势,它建议您的编译器是最近的设计之一。正如您所发现的,使用名称Books是多余的,甚至会产生警告/错误。 (编译器依赖)

使用以下语法,您只需使用Book来声明struct Book的新实例(没有名称Books):

typedef struct
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;  

Book book, *pBook; //etc.  

而且,它也倾向于 使代码更简洁,即必须编写struct Book而不是{ {1}}每次我们想要使用它来声明一个新实例,或者在函数参数中使用它:

答案 1 :(得分:1)

你可以省略第一本书,如下:

typedef struct
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;

但那对于链表而言是不行的,其中struct需要能够保存指向自身的指针:

struct List
{
    int data;
    struct List * next;  //  this line requires that List appear with 'struct'
};

struct List *next;行需要知道有一个名为List的结构 - 这要求struct List出现在该行之前。

如果你遗漏第二个,那么每次你想在你的程序的其余部分中使用它时,你需要输入struct Book而不是Book。 (有些人认为这是一个功能,而不是错误!)

(在C ++中,作为参考,第一个Book就足够了,没有必要在其他地方使用struct,因此typedef没用。)

答案 2 :(得分:0)

您可以使用struct Books作为类型。它是

的简写
struct Book_t
{
   //...
};

typedef struct Book_t Book;

答案 3 :(得分:0)

您的代码声明的唯一类型是struct Bookstypedef从不声明类型,但只为另一种类型创建新名称。 E.g

typedef int int0;
typedef int int1;

int创建两个可与int互换的新名称,不会发明新的整数类型。

对于包含多个令牌的类型名称,typedef是将其缩写为单令牌名称的便捷工具

typedef unsinged long long int ullong;
typedef struct toto Toto; 

struct toto的后一个版本甚至具有向前声明struct的特殊性,因此您可以执行

struct toto {
  Toto* next;
};

在其自己的定义中引用struct toto

标记名称空间与标识符名称空间不同,因此以下内容甚至有效

typedef struct toto toto;
struct toto {
  toto* next;
};