2012-01-26 6 views
1

のポイントを理解していません、StructAだけを定義する代わりに_ StructA "typedef"それ?
この「_」テクニックのポイントは何ですか? Cでははちょうど私が頻繁にtypedefで、この種のを見、これらのtypedef

+1

アンダースコアはこの手法とは関係がありません。 'typedef struct StructA StructA;'も同様に動作します。 Cは構造体の命名に 'tags'を使用し、これらのタグはtypedef型と同じ名前を持つことができます。 – Matthew

+2

LinusTorvaldsのtypedefは、typedefが気に入らないので悪い例です:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=ドキュメンテーション/ CodingStyle#l268 :) –

答えて

7

、構造体をとして使用する必要があります。

struct _StructA my_variable; 

...すなわち、あなたがstructを定義するときだけでなく、structを入力するだけでなく、あなたがそれを使用するたびにしなければなりません。 typedefは、それを使用するときに入力することを除いてstructです(ただし、定義するときではありません。削除する方法はありません)。その後、typedefで、structのインスタンスを宣言すると、次のようになります。

StructA my_variable; 

を今、あなたがこれを行うことができますよう、それは完全に、struct/typedefの定義に_StructA/StructAビジネスを説明していません:

typedef struct { 
    ... 
} StructA; 

...ここでは、匿名のstructを受け取り、ただちにtypedefにフィードします。しかし、この方法を使用すると、structを内部に使用することはできません。なぜなら、(まだ)名前を持っていないからです。そのためには、次のようなものが必要です。

typedef struct _Foo { 
    int data; 
    struct _Foo *next; 
} Foo; 
+0

"それは...のタイピングを排除します"そして、それは..のように見えます。 2番目のスニペットは、 "匿名"構造体をtypedefする方法を示しています...どこかで言及する必要があります(これは、 '入力する必要はありません'というステートメントで少し矛盾します)。 – akira

+1

@akira:少し明確にしました。 – Thanatos

+0

ありがとう、私はそれを得た。それはとてもシンプルで、この質問はとても愚かです^^! C++はときどき私のCを怒らせます:) – perfwill

0

特定のデータ構造への依存を減らすことができます。例えば。 StructAの代わりにStructB(おそらくより多くのフィールドを含む)を使用する場合は、1行だけを変更する必要があります。

1

構造体の変数を宣言するたびにstructキーワードを使用しないと便利です。 typedefをなし

:typedefので

struct _StructA obj; 

struct StructA { 
    int foo; 
    double bar; 
}; 

タイプの名前は、単にStructAstruct StructAではありません:Cで

StructA obj; 
3

、あなたは構造体の型を定義するとき。 (C++ではタイプをStructAと呼ぶことができます; C++は別の言語です)

1単語の名前を主張する場合は、typedefを使用することができます既存のタイプではなく、新しいタイプ)の名前:

typedef struct StructA StructA; 

今、あなたはStructAとして、またはstruct StructAとしてのいずれかのタイプを参照することができます。Iは、構造体タグおよび型定義に同じ識別子を使用

typedef struct StructA { 
    int foo; 
    double bar; 
} StructA; 

これらは、単一の宣言に組み合わせることができます。彼らは異なる名前空間にあるので、これは完全に有効です。

一方、私自身の好みはtypedefを完全に省略して、タイプをstruct StructAと呼ぶことです。

ご質問の中で、_StructA_LinusTorvaldsという名前は実装に予約されており、お客様のコードで使用しないでください。一般に、アンダースコアで始まる識別子は避けるべきです。 (そのような識別子を使用するのは珍しいことではありませんが、コードがC実装の一部でない限り間違っています)。

要約:typedefは、タイプに1単語の名前(これは本当に必要ではありません)、typedefを使用する場合、typedefとstructタグに異なる識別子を使用する本当の理由はありません。

+0

+1にチェックを入れていますが、3回目のスナップショットで 'typedef'を忘れました。また、ニックピックとしては、C++の 'struct StructA'もあります。 C++では、あいまいさがなければ 'struct'を省略できます。つまり、その名前を持つ他の識別子は同じスコープで宣言されません。 'struct stat'を例に考えてください。 –

+0

@JensGustedt:ニックのおかげです! –

+0

このタイプのtypedefは、Glib/Gtkのソースコードとibusライブラリで広く使用されています。 – perfwill

関連する問題