Denis Golovkin Denis Golovkin - 2 months ago 20
C Question

Syntax: typedef and struct tag explanation

In following example:

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


The
Book
can be used then, to declare variable, like:

Book myBook;


But what the meaning of
Books
? How it can be used, or why we need it?
I interested mostly in plain C, but if you can explain about C++ as well it will be great.

--edited--

To be more specific, what the difference between code above and following code:

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


Why we ever need an extra literal in first example?

Found good explanation here:
Tag vs. Type Names in C and C++

Answer

The typedef says that Book is an alias for struct Books. Anywhere you use one, you can use the other.

The only exception is if struct Books contains a pointer to another struct Books. In that case, you can't use the alias.

EDIT:

You can do the above if you use a forward declaration:

typedef struct Books Book;

struct Books {
   Book *moreBooks;
}

As for Books, that by itself is not a valid type. You need to prefix it with the struct keyword. This differs from C++ where the struct (or class) keyword is optional when referencing it.

EDIT 2:

In the second code sample you give, Book is an alias for an anonymous struct. In that case, the alias must be used to reference it.