4

我正在玩在 go 中调用 C 代码。但是,当我尝试使用printffrom go 时,我收到有关格式字符串不是字符串文字的警告:

package main

// #include <stdio.h>
import "C"

func main() {
    C.printf(C.CString("Hello world\n"));
}

警告:

警告:格式字符串不是字符串文字(可能不安全)[-Wformat-security]

如何将字符串文字传递给 C 函数,例如printf?是否有类似于C.CString()我可以使用的功能,或者它是不可能的,我应该忽略这个警告?

4

1 回答 1

2

使用 printf 时,格式字符串最好是字符串文字而不是变量。并且 C.CString 是 go runtime 转换的字符指针。而且您可能不会在最新版本中使用 printf 的可变参数。在其他情况下,如果要删除警告,请使用类型转换:

package main

/*
typedef const char* const_char_ptr;
#include <stdio.h>
*/
import "C"

func main() {
    C.puts((C.const_char_ptr)(C.CString("foo")))
}

编辑

请注意,免费调用 C.CString。

package main

/*
typedef const char* const_char_ptr;
#include <stdio.h>
*/
import "C"
import "unsafe"

func main() {
    ptr := (C.const_char_ptr)(C.CString("foo"))
    defer C.free(unsafe.Pointer(ptr))
    C.puts(ptr)
}
于 2014-02-19T06:55:59.793 回答