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

Book を使用してのみオブジェクトを定義でき、Books を使用すると不明な型が得られる上記の例に出くわしました。なくてもいいのはわかっているBooksのですが、そもそも持っている目的は何ですか?

4

4 に答える 4

1

次のように、最初の 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 は役に立ちません。)

于 2013-11-13T22:57:52.297 に答える
0

コードで宣言されている型は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;
};
于 2013-11-14T00:19:59.897 に答える