LoginSignup
2
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-05

CrystalだとCバインディングによってC言語の機能が使えます。
構造体型や共用体も使えたりします。

Union(共用体)について

構造体は身も蓋もない言い方をすると、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]

当然ですが、構造体だとメンバ同士はメモリは独立していますが、共用体だとアドレスを共有していることが分かります。
(どういう共用になるかはエンディアン次第)

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3