• cstring类型

    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