Edited at

CrystalでCバインディングを試してみる(構造体と共用体)

More than 3 years have passed since last update.

CrystalだとCバインディングによってC言語の機能が使えます。

構造体型や共用体も使えたりします。

Union(共用体)について

http://nanoappli.com/blog/archives/3846

構造体は身も蓋もない言い方をすると、C++のクラスからメソッド機能を取り払い、デフォルトのアクセサをpublicにしたもの、くらいの認識です。(最近の仕様で変わってるかもしれませんが)

Crystalで構造体と共用体を使用したい場合、以下のドキュメントに従うと

http://ja.crystal-lang.org/docs/syntax_and_semantics/c_bindings/union.html

こんな感じになります。


# char型配列にデータを代入するため
lib C
fun strcpy(s : LibC::Char*, a : LibC::Char*)
end

lib U
# C では:
#
# union Staff {
# int id;
# char name[4];
# };
union Staff
id : Int32
name : LibC::Char[4]
end
end

staff = U::Staff.new
staff.id = 65535
puts staff.name #=> [255,255,0,0]

# 以下は構造体との動作比較
lib C
struct Staff
id : Int32
name : LibC::Char[4]
end
end

staff_ = C::Staff.new
staff_.id = 65535
puts staff_.name #=> [0,0,0,0]

当然ですが、構造体だとメンバ同士はメモリは独立していますが、共用体だとアドレスを共有していることが分かります。

(どういう共用になるかはエンディアン次第)