組み込みアノテーション¶
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
など、いくつかのメソッドの動作が変更されます。