跳至内容

内置注解

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