将字符串文字传递给C.

时间:2014-02-19 02:16:45

标签: c string go cgo

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

package main

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

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

警告:

  

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

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

1 个答案:

答案 0 :(得分:2)

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

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)
}