コンテンツにスキップ

組み込みアノテーション

Crystalの標準ライブラリには、いくつかの定義済みアノテーションが含まれています。

Cライブラリをリンクする方法をコンパイラに指示します。これはlibセクションで説明されています。

外部

Crystalの構造体にこのアノテーションを付けると、lib宣言で使用できるようになります。

@[Extern]
struct MyStruct
end

lib MyLib
  fun my_func(s : MyStruct) # OK (gives an error without the Extern annotation)
end

構造体をC言語の共用体のように動作させることもできます(これは非常に危険な場合があります)。

# A struct to easily convert between Int32 codepoints and Chars
@[Extern(union: true)]
struct Int32OrChar
  property int = 0
  property char = '\0'
end

s = Int32OrChar.new
s.char = 'A'
s.int # => 65

s.int = 66
s.char # => 'B'

スレッドローカル

@[ThreadLocal]アノテーションは、クラス変数とC言語の外部変数に適用できます。これにより、それらはスレッドローカルになります。

class DontUseThis
  # One for each thread
  @[ThreadLocal]
  @@values = [] of Int32
end

ThreadLocalは、ランタイムを実装するために標準ライブラリで使用されており、それ以外の場所では必要ありませんし、使用すべきでもありません。

パック

C構造体をパック済みとしてマークします。これにより、フィールド間にパディングバイトが自動的に挿入されるのを防ぎます。これは通常、Cライブラリが明示的にパック構造体を使用している場合にのみ必要です。

常にインライン化

メソッドを常にインライン化するようにコンパイラにヒントを与えます。

@[AlwaysInline]
def foo
  1
end

インライン化しない

メソッド呼び出しをインライン化しないようにコンパイラに指示します。メソッドがyieldする場合、yieldする関数は常にインライン化されるため、これは効果がありません。

@[NoInline]
def foo
  1
end

2回戻る

メソッドまたはlib funを2回戻るものとしてマークします。C言語のsetjmpはそのような関数の例です。

発生させる

メソッドまたはlib funが例外を発生させる可能性があることをマークします。これはコールバックセクションで説明されています。

呼び出し規約

lib funの呼び出し規約を示します。例えば、

lib LibFoo
  @[CallConvention("X86_StdCall")]
  fun foo : Int32
end

有効な呼び出し規約のリストは次のとおりです。

  • C(デフォルト)
  • 高速
  • 低速
  • WebKit_JS
  • AnyReg
  • X86_StdCall
  • X86_FastCall

これらはこちらで説明されています。

フラグ

列挙型を「フラグ列挙型」としてマークします。これにより、to_sなど、いくつかのメソッドの動作が変更されます。