C typedef结构中定义前名称的用途

C typedef结构中定义前名称的用途,c,struct,typedef,C,Struct,Typedef,我遇到了上面的例子,在这个例子中,我只能使用Book定义对象,而使用Book给出未知类型。我知道我可以完全不用书籍,那么拥有它的目的是什么呢?你可以使用结构化书籍作为一种类型。这是英语的简写 typedef struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } Book; 使用书籍会产生未知的类型 这很好。这表明您的编译器是最新的设计之一,遵循C编程的

我遇到了上面的例子,在这个例子中,我只能使用Book定义对象,而使用Book给出未知类型。我知道我可以完全不用
书籍
,那么拥有它的目的是什么呢?

你可以使用
结构化书籍
作为一种类型。这是英语的简写

typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;
使用书籍会产生未知的类型

这很好。这表明您的编译器是最新的设计之一,遵循C编程的当前趋势。正如您所发现的,使用名称book是多余的,甚至会产生警告/错误。(依赖于编译器)

使用以下语法,您可以简单地使用Book来声明struct Book的新实例(无需使用名称簿):


而且,它也倾向于使代码不那么冗长,即每次我们想要使用它声明新实例或在函数参数中使用它时,必须编写
结构书
,而不是只编写
结构书

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

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

Book book, *pBook; //etc.  
但这对链表不起作用,在链表中,结构需要能够保存指向自身的指针:

typedef struct
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Book;
struct List*next
需要知道有一个名为
List
的结构-这要求
struct List
出现在该行之前

如果省略第二个,则每次要在程序的其余部分中使用它时,都需要键入
struct Book
,而不是
Book
。(有些人认为这是一个特性,而不是一个bug!)


(在C++中,第一个代码< <代码> >是足够的,不必在别处使用<代码>结构> /CODE,因此Type不有用。

< P>您的代码声明的唯一类型是StuttBooo> <代码>。
typedef
从不声明类型,只为另一个类型创建新名称。例如

struct List
{
    int data;
    struct List * next;  //  this line requires that List appear with 'struct'
};
int
创建两个可与
int
互换的新名称,但未发明新的整数类型

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

typedef int int0;
typedef int int1;
struct toto
的后一个函数甚至具有向前声明
struct
的特殊性,因此您可以这样做

typedef unsinged long long int ullong;
typedef struct toto Toto; 
也就是说,请在其自身定义中参考结构toto

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

struct toto {
  Toto* next;
};

那么我应该不能声明Book\t类型的对象吗?到目前为止,我还不能这么做。@ShamimHafiz-是的,但只使用
Book
,而不是
struct Book
。他建议您现在可以使用
Book
来声明struct Book\t的新实例。例如,Book Book,*pBook;创建
struct Book\u t
的实例和指向
struct Book\u t
struct toto {
  Toto* next;
};
typedef struct toto toto;
struct toto {
  toto* next;
};