typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
我遇到了上面的例子,我只能使用Book来定义对象,并且使用Books提供未知类型。我明白我可以完全没有Books
,那么首先拥有它的目的是什么?
答案 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 Books
。 typedef
从不声明类型,但只为另一种类型创建新名称。 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;
};