共用体
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/27 00:24 UTC 版)
C#
C#では、共用体専用の構文は存在しない。
ただし、System.Runtime.InteropServices.StructLayoutAttribute
で明示的なレイアウトを指定した構造体では、共用体同様の動作を指定することが可能である。
以下に例を示す。
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
public struct Union {
// メモリレイアウトのオフセットを指定する
[FieldOffset(0)]
public byte B0;
[FieldOffset(1)]
public byte B1;
[FieldOffset(2)]
public byte B2;
[FieldOffset(3)]
public byte B3;
// メモリレイアウトのオフセットを B0, B1, B2, B3 と同じ領域に重ねる
[FieldOffset(0)]
public int N;
}
class Program {
static void Main() {
var u = new Union();
// N の領域に値を書き込む
u.N = 0x12345678;
// B0, B1, B2, B3 の領域より値を読み出す
Console.WriteLine(u.N.ToString("X")); // ⇒ 12345678
Console.WriteLine(u.B0.ToString("X")); // ⇒ リトルエンディアンでは 78
Console.WriteLine(u.B1.ToString("X")); // ⇒ リトルエンディアンでは 56
Console.WriteLine(u.B2.ToString("X")); // ⇒ リトルエンディアンでは 34
Console.WriteLine(u.B3.ToString("X")); // ⇒ リトルエンディアンでは 12
}
}
- ^ 例えばMicrosoft Windows SDKの
<oaidl.h>
では、共用体を利用したVARIANT
型が定義されている。 - ^ 共用体宣言 - cppreference.com
- ^ 多くのCコンパイラでは(C11よりも前の時代から)拡張として無名の構造体および共用体をサポートしている。
- ^ 全ての共用体メンバは必ずPODだが、共用体自身がPODになるとは限らない。共用体はユーザー定義のコンストラクタなどを持てるからである。
- ^ 共用体の型名を決める識別子(
union xxx {...};
のxxx
)のことで、冒頭の説明にある「タグ情報」とは別物。 - ^ 多くのC++コンパイラでは拡張として無名の構造体をサポートしている。
固有名詞の分類
- 共用体のページへのリンク