cstring类型

cstring 类型意味着 compatible string 是编译后端的字符串的原生表示。 对于C后端,cstring 类型表示一个指向零终止char数组的指针,该数组与Ansi C中的 char* 类型兼容。 其主要目的在于与C轻松互通。 索引操作 s [i] 表示 s 的第i个 char;但是没有执行检查 cstring 的边界,使索引操作不安全。

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

  1. proc printf(formatstr: cstring) {.importc: "printf", varargs,
  2. header: "<stdio.h>".}
  3.  
  4. printf("This works %s", "as expected")

即使转换是隐式的,它也不是 安全的 :垃圾收集器不认为 cstring 是根,并且可能收集底层内存。 然而在实践中,这几乎从未发生过,因为GC保守地估计堆栈根。 可以使用内置过程 GC_refGC_unref 来保持字符串数据在少数情况下保持活动状态。

为返回字符串的cstrings定义了 $ proc。因此,从cstring获取一个nim字符串:

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