typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
我遇到了上面的例子,我只能使用 Book 定义对象,而使用 Books 会给出未知类型。我知道我可以完全没有Books
,那么首先拥有它的目的是什么?
使用书籍给出未知类型
这很好。它表明您的编译器是最新设计之一,遵循 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
每次我们想要使用它来声明一个新实例,或者在函数参数中使用它:
您可以省略第一本书,如下所示:
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 没有用。)
您可以struct Books
用作类型。它是简写
struct Book_t
{
//...
};
typedef struct Book_t Book;
您的代码声明的唯一类型是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;
};