typedefを使用するときに構造体の変数の名前を変更することはできますか?typedefのときに変数の名前を変更しますか?
typedef struct {
float x;
float y;
float z;
} Vector;
typedef Vector {
float r;
float g;
float b;
} Color;
typedefを使用するときに構造体の変数の名前を変更することはできますか?typedefのときに変数の名前を変更しますか?
typedef struct {
float x;
float y;
float z;
} Vector;
typedef Vector {
float r;
float g;
float b;
} Color;
:新しい構造型を宣言する必要がある「色ベクトルと同じですが、名前のx
、y
とz
に変更しましたr
,g
およびb
"?
もしそうなら、答えはいいえ、Cはそれを提供しません。(私が提供するものは、それが合理的に近い代用品であると考えることはできません)。
編集:あなたは、しかし、機能はかなり簡単にいずれか一方に操作することができます:
typedef union {
Color c;
Vector v;
} cv;
int my_func(cv *value);
C保証と同じ順序で同じ種類のアイテム(の初期シーケンスこのケースでおり、それらのすべてである)はどちらかのセレクタを介して均等に働くことができます。あなたはcv
にVector
を入れて、関数に渡した場合、それは書き込み言い換えれば、機能は、例えば(何の問題もなくr
、g
とb
のいずれかとしたりx
、y
とz
としてこれらの3つの項目で作業することができますg
に変更すると、Color
の代わりにVector
と表示されると、y
が変更されます)。
編集:C99、§6.5.2.3/ 5:
一つの特別な保証は労働組合の使用を簡素化するために構成されています。組合は共通の初期シーケンスを共有するいくつかの構造が含まれている場合(下記参照)、現在ユニオンオブジェクトにこれらの構造のいずれかが含まれている場合、そのユニオンの完全な型の宣言が可視であればどこでもそれらの共通の初期部分を検査することが許可されます。対応するメンバが1つ以上の初期メンバのシーケンスに対して互換性のある型(およびビットフィールドの場合、同じ幅)を持つ場合、2つの構造は共通の初期シーケンスを共有します。この場合
、c
とv
の全てメンバーが同じ順序で同じタイプを持っているので、このルールは、いずれかの部材の全体に適用されます。しかし、これを繰り返すことで、共通の初期シーケンスを "検査"することができます。これはおそらく書き込みを含まないでしょう(しかし、どのように書くかは想像するのが難しいでしょう。よく)。
私が最も近いものがちょうど秒1を作り、第二に最初のものをコピーすることでしょう...それが可能だとは思いませんが、C.
には反射(私の知る限り最も近い概念)がありません編集 - 構造のメンバーの名前を変更することについて話していますか?これらのシンボルは、コンパイル時にマップされます。あなたはかもしれません。シンボルテーブルを混乱させるかもしれませんが、私はそれを疑うでしょう、そして、それは危険なことは言うまでもなく、巨大な過度の残骸のように思えます。
いいえ、できません。おそらくあなたは言わせてしまうtypedef
のいくつかの並べ替えを意味
typedef struct {
float x;
float y;
float z;
} Vector;
typedef struct {
float r;
float g;
float b;
} Color;
私は両方の機能をサポートすることができますか?私は単純に引数としてvoid *を取ることができ、それが3つの浮動小数点構造体であると仮定します。 –
はい、あなたはそれを行うことができます。注意してください。あなたが*真の多型を望むなら、そのパラダイムをよりよくサポートする言語を使う必要があります。 –
次に、Cコンパイラをアセンブラとして使用します。 Cでは、構造が同じでも2つの異なる型があります。あるタイプのオブジェクトを別のタイプのオブジェクトとして使用することは、明確に定義されていません。しかし、別々の翻訳単位の間では、構造体は構造的に互換性があります(同じ名前の同じ順序で同じタイプのメンバーを持つ場合)。これは、各翻訳単位で(同じヘッダファイルの同じタイプでも)構造体タイプを別々に定義する必要があるためです。異なるコンパイルジョブ間では、実際には/同じ/同じタイプではありません。 – Kaz
機能的な抽象化を行うことです。
要旨:
typedef Vector Color; /* a color is a kind of vector */
float color_red(Color *c)
{
return c->x;
}
他のどこでも、あなたはC-> X(c)をCOLOR_REDしていない使用しています。
私はこれをLispプログラミングで常に実行します。私は物事のペアを望んで、最高のツールはコンスセルです。コンスセルにはCARとCDRというフィールドがあります。これは大丈夫です。これらを別の名前で囲む関数を書くだけです。 (CARとCDRは、明白なリスト用途を明確にするために、FIRSTとRESTとも呼ばれます)。
他の回答は、しかし、私は匿名の構造体をサポートするC11を聞いたので、良い古い
を行うかもしれません。もちろん
が重くr
、g
とb
のそれとx
、y
とz
の使用を混ぜると、未定義の挙動を示すことができますが、r
の読み取りが確実にだけx
に書き込まれた値を与えるものではありません何の実装はありません召し上がれ。
これを設定しようとしましたが、cvPointer-> xを実行するとエラーが発生し、cvPointer-> v-> xを実行するとエラーが発生します。 –
UBの最後の作品に書かれていない組合のメンバーを読むことが考えられました。またはこれはC++のためだけに保持されますか? –
@stasもちろん、 'cvPointer-> v.x'です。 –