2009-07-22 10 views
1

重複の可能性:
Why should we typedef a struct so often in C?
Difference between ‘struct’ and ‘typedef struct’ in C++?structを宣言するときにtypdefを使用するときの違いは何ですか?

次の型宣言の違いは何ですか?私は

struct 
{ 
    int age; 
}Person; 

を作成して、無名の構造体のインスタンスを理解

struct Person 
{ 
    int age; 
}; 


typedef struct 
{ 
    int age; 
}Person; 

struct Person 
{ 
    int age; 
}; 

は人と呼ばれるタイプではなく、インスタンスを宣言した人を、と呼ばれます。しかし、私はまだtypedefが何をするのか分からない。

+0

はhttp://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c – Laserallan

+0

の複製および少なくとも半ダースの他の質問のように思えます。 – jalf

答えて

4

私はCと同じだと思いますが、typedefは型のエイリアスを作成します。最初のケースでは型の名前は "struct Person"で、2番目のケースではちょうど "Person"です。通常

、あなたは構造が定義されるまでのtypedefが影響していないため、例えば、(あなたは前方宣言を行う場合を除く)、あなたは両方を使用して、(リストのような)自己参照構造体を宣言する必要があります。

typedef struct node { 
    void *data; 
    struct node *next; 
} TNode, *PTNode; 

ので、今、あなたは、次の方法で同じ型の変数を宣言することができます。

struct node *node1; 
TNode *node2; 
PTNode node3; 

3つの変数が上記の、ノード構造体へのポインタと同じです。

+0

これは私がウィキペディアのページから得た理解だった。 –

+0

あなたはそれを正しく持っています:-) – fortran

+0

C++では(これは質問についてです)、これはCと同じではありません。 – sbi

2

Cの構造体のtypedefの使用については、hereと説明しています。そこレガシーCコード

ない程度確かに、Cの++で

+0

ああ...私が検索したときにうまくいかなかった良いコール、ありがとう! –

+0

実際、アンソニーがC++について尋ねたのに対し、リンク先の質問はCに関するものでした。そして違いがあります。 – sbi

+0

質問の表現方法は、Cでのtypedefの使用についても混乱があるように見えました。私は私の答えを改めるつもりです。 – KSchmidt

0

C-互換性 本質的に同じ(クラスのメンバーは、デフォルトでプライベートでのに対し、C++で、構造体は、デフォルトで公開されていますメンバーとのちょうどクラスです)あなたがこのように定義するとき、無名の構造体の静的関数とtypedefを参照しています。決して行っていません。

2

構造体の型名を使用する場合は、構造体は独自の名前空間に存在するため、struct Personと記述する必要があります。 typedefは、その接頭辞の必要性を排除します。

C++では、structは他のものと同じ名前空間に存在するため、これを行う必要はありません。これは通常、不要なCアイムと見なされます。

0

機能

に人や構造体の人に渡すとき、あなたが

struct Person { ... }; 

を定義した場合は、明示的にそれが構造体

void foo(struct Person person) { ... } 
であることを知らせる機能にそれを渡す必要がある違いを見分けることができます

一方、定義した場合、

typedef struct Person { ... }; 

あなたは、キーワードのtypedefは、あなたが実際にデータ型を定義することができますので、それは構造体は、この場合には、人であることを述べるてはいけないと、あなたは他のデータ型のようにかなりそれをこのよう

void foo(Person person) { ... } 

を渡しますこれはC++のtypedef

+0

を意味する typedef struct {...} Person; ?とにかく、これはC言語でのみでなくC言語でもそうです。 – sbi

0

を助け

希望は、他のタイプではなく、別個のタイプの同義語です。それらは一般的に2つの目的のために使用されます:

  • あなたは特定のプラットフォームを抽象化するポータブルコードを作成します。 1つのプラットフォームではtypedef int int32を、別のプラットフォームではtypedef long int32を使用できます。コード全体でint32を使用し、新しいプラットフォームに移植する場合は、要件に合わせてtypedefを変更するだけで済みます。

  • 非常に複雑な種類のエイリアスを作成する。例えば。 typedef char const* const* cppchar。あなたのコードにchar const* const*を書くのではなく、cppcharと書くことができます。

関連する問題