2009-06-11 10 views
2

このような私の構造を使用していました。私はエラーを隠すことができると言っているので、typedefを好きではありません。 しかし、私はいくつかのサンプルコードを見ていて、このように宣言された構造体を見ました。そして、これは私がそれらを宣言する通常の方法です。宣言構造の違い

次のように使用して
struct person 
{ 
    int age; 
    char name[32]; 
}; 

:すべてのこれらの違いは何

struct 
{ 
    int age; 
    char name[32]; 
}person; 

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

:しかし、私はこのように宣言構造を見てきました

struct person person_a; 
    person_a.age = 20; 
    etc. 

を異なる技術、あなたがどの特定のものを使うのが最善であるかを決める方法は?任意の提案のための

多くのおかげで、

+2

なぜtypedefがエラーを隠すことができるのか不思議です。私はtypedefを好む傾向があります。特に、 'extern void func(struct something * xxx);を使用することで問題に遭遇することができないためです。あらかじめ 'struct something'の宣言はしていません。つまり、 'extern void func(something * xxx);'コンパイルするには何かのtypedefが必要です。代替策はコンパイルしますが、あなたが期待していることはしません(しかし、それを逃してしまうかもしれません)。 –

答えて

17

この:

struct 
{ 
    int age; 
    char name[32]; 
}person; 

structある変数personを宣言します。 structには名前はありませんが、引き続き同じ方法でperson変数を使用します。

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

これは同じです:

struct _person 
{ 
    int age; 
    char name[32]; 
}; 
struct _person person; 

それは_personという名前structを宣言し、その後タイプstruct _personpersonと呼ばれる変数になります。第一のコードは、ちょうど人の構造体を作成し

struct person 
{ 
    int age; 
    char name[32]; 
}; 
struct person var; 
1

は、と同じことです。
2番目のコードは、person_aというperson構造体のインスタンスを作成します。
3番目のコードは、名前のない構造体とpersonというインスタンスを作成します。 4番目のコードは、_personという名前の構造体とpersonという名前のインスタンスを作成します。

1

struct person 
{ 
    int age; 
    char name[32]; 
} var; 

魔法が実際にそこにありません

1

構造体定義の目的が、ローカルモジュールの外で意味を持つ論理データ構造体を宣言することである場合、ヘッダファイルに最初の構造体があることが予想されます。

現実世界のCコードでは、構造は、範囲内の局所的である実用的な理由で宣言されることが多い。たとえば、バッファにコピーされるデータをフォーマットします。このような場合は、構造体型と変数宣言をマージするのが非常に便利で論理的です。また、構造型のアノニマス宣言を使用すると、不要な名前で名前空間が乱雑にならないようになります。

これらの例の批判が1つあります。Cでは、先頭にアンダースコアが付いた名前は、慣例によりコンパイラベンダーのために予約されていると見なされます。だから私は最後の例がベストプラクティスと一貫しているとは思わない。

2

最後の2つの構造の両方で、personという構造体のストレージを割り当てました。

struct person 
{ 
    int age; 
    char name[32]; 
}; 

それはちょうど宣言です;:私は何を意味

は、あなたがこのような何かを持っている場合であります変数の割り当てはありませんので、コード内で使用することはできません。

struct person p1; 

を次に、p1はp1.ageまたはp1.nameを利用することができ、実世界のコードの面では

など、代わりに:あなたは次のように宣言した後に、この構造を使用して起動することができます

struct _person 
{ 
    int age; 
    char name[32]; 
}person; 

我々は通常この場合

typedef struct _person 
{ 
    int age; 
    char name[32]; 
} person_t; 

を参照してください、私たちはタイピングともっと重要なのを保存することができます構造体は、intなどの他のビルトイン型と同様に動作します。 たとえば、

person_t p1;

person_t * p1;

などです。

2

最初のケース(2番目の例)では、この構造に別のオブジェクトが必要な場合は、この方法を使用します。これはきれいに見えるとあなたは準備ができてオブジェクトが「人」という名前ている後者の場合、なぜあなたを説明する

struct _person object2 

これがあると、後にオブジェクトを作成するためのオプションのためのコード:)

に高速ですどちらのアプローチを使用します。それらの違いについては上に説明した。

関連する問題