内置注解¶
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
不内联¶
告诉编译器永不内联方法调用。如果方法产生,则此操作无效,因为产生方法始终被内联。
@[NoInline]
def foo
1
end
返回两次¶
标记方法或 lib fun 为返回两次。C setjmp
是此类函数的一个示例。
引发¶
标记方法或 lib fun 为可能引发异常。这在 回调 部分有解释。
调用约定¶
指示 lib fun 的调用约定。例如
lib LibFoo
@[CallConvention("X86_StdCall")]
fun foo : Int32
end
有效调用约定的列表为
- C(默认)
- 快速
- 冷
- WebKit_JS
- AnyReg
- X86_StdCall
- X86_FastCall
它们在此处有解释 here.
标志¶
标记 枚举 为“标志枚举”,这将改变其某些方法的行为,例如 to_s
。