UNION は、非 OOP の世界である種のポリモーフィズムを実装します。通常、共通の部分があり、その部分に応じて残りの UNION を使用します。したがって、OOP 言語を持っておらず、過度のポインター演算を避けたい場合は、共用体の方が洗練されている場合があります。
シフト/マスク操作の代わりに、たとえばレジスタにビットを設定するのに役立ちます:
typedef union {
unsigned int as_int; // Assume this is 32-bits
struct {
unsigned int unused1 : 4;
unsigned int foo : 4;
unsigned int bar : 6;
unsigned int unused2 : 2;
unsigned int baz : 3;
unsigned int unused3 : 1;
unsigned int quux : 12;
} field;
} some_reg;
注:パッキングがどの方法で行われるかは、マシンに依存します。
some_reg reg;
reg.field.foo = 0xA;
reg.field.baz = 0x5;
write_some_register(some_address, reg.as_int);
私はそこのどこかでいくつかの構文を吹き飛ばしたかもしれません.私のCは錆びています:)
編集:
ちなみに、これは逆の方法でも機能します:
reg.as_int = read_some_register(some_address);
if(reg.field.bar == BAR_ERROR1) { ...
実際、デバイス ドライバ (struct
いくつかの類似しているが異なるフォーマットを持つことができるデバイスに送信したい場合)、正確なメモリ配置が必要です...