4

goでCコードを呼び出して遊んでいます。ただし、goから使用しようとするとprintf、フォーマット文字列が文字列リテラルではないという警告が表示されます。

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 ランタイムによって char ポインタに変換されます。また、最新の go で 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 の呼び出しは free であることに注意してください。

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 に答える