のポイントを理解していません、StructAだけを定義する代わりに_ StructA "typedef"それ?
この「_」テクニックのポイントは何ですか? Cでははちょうど私が頻繁にtypedefで、この種のを見、これらのtypedef
答えて
、構造体をとして使用する必要があります。
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;
特定のデータ構造への依存を減らすことができます。例えば。 StructA
の代わりにStructB
(おそらくより多くのフィールドを含む)を使用する場合は、1行だけを変更する必要があります。
構造体の変数を宣言するたびにstruct
キーワードを使用しないと便利です。 typedefをなし
:typedefので
struct _StructA obj;
:
struct StructA {
int foo;
double bar;
};
タイプの名前は、単にStructA
struct StructA
ではありません:Cで
StructA obj;
、あなたは構造体の型を定義するとき。 (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タグに異なる識別子を使用する本当の理由はありません。
+1にチェックを入れていますが、3回目のスナップショットで 'typedef'を忘れました。また、ニックピックとしては、C++の 'struct StructA'もあります。 C++では、あいまいさがなければ 'struct'を省略できます。つまり、その名前を持つ他の識別子は同じスコープで宣言されません。 'struct stat'を例に考えてください。 –
@JensGustedt:ニックのおかげです! –
このタイプのtypedefは、Glib/Gtkのソースコードとibusライブラリで広く使用されています。 – perfwill
- 1. このtypedefはどのように機能しますか?
- 2. これらの `typedef`の目的は何ですか?
- 3. これらの2つのtypedefの実装は、構造が同等ですか?
- 4. ルーティングはちょうど私がちょうど他の人からこのプロジェクトを持って、私はこの奇妙な振る舞いを得Laravel
- 5. これらのコードはどちらも同じことでしょうか?
- 6. これらのC++ステートメントの意味typedef vector <double> :: size_type
- 7. のtypedef
- 8. 私はちょうどこの出くわしたのUbuntu
- 9. このコードを考えると、私はちょうどLaravelストレージ
- 10. セレンさんの.textはちょうど私がこれを持って
- 11. 私はこれを行うことができる場合、私はちょうど印刷方法
- 12. 私のコードでどのくらい頻繁に(statmentがTrueの場合)知ることができますか?
- 13. バッシュは、私は頻繁にこのような何かを最後
- 14. テンプレートのtypedefは、カスタムアロケータ
- 15. なぜこのtypedefが動作しないのですか
- 16. C#のエイリアスキーワード(typedefなど)?
- 17. コンパイラがtypedefとnon-typedefを区別できないのはなぜですか?
- 18. インテリセンスは、だから私はちょうど私のプロジェクトにクラスを追加し、これをしたにModelState
- 19. このtypedefステートメントの構文は何ですか?
- 20. typedef structのメモリリーク
- 21. typedefのコンパイラエラー
- 22. クラスメンバーのtypedef
- 23. 別のtypedef
- 24. クラス内のtypedef
- 25. のtypedef ++メタプログラミング
- 26. typedefの範囲
- 27. C - typedefのインクルードファイル
- 28. コンポジットパターンは、ちょうどアレイに私をもたらすのでしょうか?
- 29. C#typedefが
- 30. 「myStateType」が#typedef
アンダースコアはこの手法とは関係がありません。 'typedef struct StructA StructA;'も同様に動作します。 Cは構造体の命名に 'tags'を使用し、これらのタグはtypedef型と同じ名前を持つことができます。 – Matthew
LinusTorvaldsのtypedefは、typedefが気に入らないので悪い例です:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=ドキュメンテーション/ CodingStyle#l268 :) –