cstring类型

cstring 类型意思是 compatible string “兼容字符串”,是编译后端字符串的原生表示。对于 C 后端, cstring 类型表示一个指向末尾为零的 char 数组的指针,该数组与 ANSI C 中的 char* 类型兼容。其主要目的是与 C 轻松互通。索引操作 s[i] 表示 s 的第 i 个 char ,但是不检查 cstring 的边界,因而索引操作并不安全。

为方便起见,Nim 中的 string 可以隐式转换为 cstring 。如果将 Nim 字符串传递给 C 风格的可变参数过程,也会隐式转换为 cstring :

  1. proc printf(formatstr: cstring) {.importc: "printf", varargs,
  2. header: "<stdio.h>".}
  3. printf("这会%s工作", "像预期一样")

即使转换是隐式的,它也不是 安全的 : 垃圾收集器不认为 cstring 是根,并且可能收集底层内存。因此,隐式转换将在 Nim 编译器的未来版本中删除。 某些习语,例如将 const 字符串转换为 cstring 是安全的,并且仍将被允许。

为 cstring 定义的 $ 过程能够返回 string 。因此,从 cstring 获得 nim 的 string 可以这样:

  1. var str: string = "Hello!"
  2. var cstr: cstring = str
  3. var newstr: string = $cstr

cstring 字面值不应被修改。

  1. var x = cstring"literals"
  2. x[1] = 'A' # 这是错的!!!

如果 cstring 来自常规内存(而不是只读内存),则可被修改:

  1. var x = "123456"
  2. var s: cstring = x
  3. s[0] = 'u' # 这是可以的

cstring 值像字符串一样,也可用于 case 语句。