cstring类型
cstring 类型意味着 compatible string 是编译后端的字符串的原生表示。 对于C后端,cstring
类型表示一个指向零终止char数组的指针,该数组与Ansi C中的 char* 类型兼容。 其主要目的在于与C轻松互通。 索引操作 s [i] 表示 s 的第i个 char;但是没有执行检查 cstring 的边界,使索引操作不安全。
为方便起见,Nim中的 string 可以隐式转换为 cstring 。 如果将Nim字符串传递给C风格的可变参数proc,它也会隐式转换为 cstring :
- proc printf(formatstr: cstring) {.importc: "printf", varargs,
- header: "<stdio.h>".}
- printf("This works %s", "as expected")
即使转换是隐式的,它也不是 安全的 :垃圾收集器不认为 cstring 是根,并且可能收集底层内存。 然而在实践中,这几乎从未发生过,因为GC保守地估计堆栈根。 可以使用内置过程 GC_ref 和 GC_unref 来保持字符串数据在少数情况下保持活动状态。
为返回字符串的cstrings定义了 $ proc。因此,从cstring获取一个nim字符串:
- var str: string = "Hello!"
- var cstr: cstring = str
- var newstr: string = $cstr