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

我遇到了上面的例子,我只能使用 Book 定义对象,而使用 Books 会给出未知类型。我知道我可以完全没有Books,那么首先拥有它的目的是什么?

4

4 回答 4

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而不是Book每次我们想要使用它来声明一个新实例,或者在函数参数中使用它:

于 2013-11-13T22:55:33.607 回答
1

您可以省略第一本书,如下所示:

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

但这不适用于链表,其中结构需要能够保存指向自身的指针:

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 没有用。)

于 2013-11-13T22:57:52.297 回答
0

您可以struct Books用作类型。它是简写

struct Book_t
{
   //...
};

typedef struct Book_t Book;
于 2013-11-13T22:50:29.070 回答
0

您的代码声明的唯一类型是struct Books. Atypedef从不声明一种类型,而只是为另一种类型创建一个新名称。例如

typedef int int0;
typedef int int1;

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

对于由多个标记组成的类型名称,typedef是一种将其缩写为一个标记名称的便捷工具

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

后一个 forstruct toto甚至具有转发声明的特殊性struct,因此您可以这样做

struct toto {
  Toto* next;
};

那是指struct toto在它自己的定义中。

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

typedef struct toto toto;
struct toto {
  toto* next;
};
于 2013-11-14T00:19:59.897 回答