typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
Book を使用してのみオブジェクトを定義でき、Books を使用すると不明な型が得られる上記の例に出くわしました。なくてもいいのはわかっているBooks
のですが、そもそも持っている目的は何ですか?
次のように、最初の 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
その行の前に表示する必要があります。
2 番目を省略すると、プログラムの残りの部分で使用するたびstruct Book
に代わりに入力する必要があります。Book
(バグではなく機能だと考える人もいます!)
(C++ では、参考までに、最初のBook
もので十分であり、他の場所で使用する必要がないstruct
ため、typedef は役に立ちません。)
コードで宣言されている型はstruct Books
. Atypedef
は型を宣言することはなく、別の型の新しい名前を作成するだけです。例えば
typedef int int0;
typedef int int1;
int
と互換性のあるの 2 つの新しい名前を作成しますint
。新しい整数型は発明されません。
複数のトークンで構成される型名の場合typedef
、1 つのトークン名に短縮するための便利なツールです。
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;
};