题记:是否输出居然和是否和行尾换行有关系
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main /* #include <stdio.h> #include <stdlib.h> void myprint(char* s) { printf("%s", s); } */ import "C" import "unsafe" func main() { cs := C.CString("Hello world\n") //把这里的 \n 去掉试试,居然没有输出了 C.myprint(cs) C.free(unsafe.Pointer(cs)) } |
why? …
因为printf是行缓冲的,不看到换行就不输出,可以在printf后面刷新标准输出:
1 |
fflush(stdout); |
另,在C的printf后面使用Go的fmt.Println(“^_^”)来输出一些东西,是不是就可以把C要打印的东西给输出来了呢?
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package main /* #include <stdio.h> #include <stdlib.h> void myprint(char* s) { printf("%s", s); } */ import "C" import "unsafe" import "fmt" func main() { cs := C.CString("Hello world") C.myprint(cs) C.free(unsafe.Pointer(cs)) fmt.Println("\nEnd\n") } |
结果发现,End 输出了,Hello world还是没输出。
原因:C的输出buffer和Go的不是一个
思考:
亲,你见过用C写的一个Hello world程序是必须有换行的吗?如下:
呃,这个确实没问题,why? C在退出的时候刷新输出缓冲了呗
说明:
To access a symbol originating from the C side, use the package name C
. That is, if you want to call the C function printf()
from Go code, you write C.printf()
. Since variable argument methods like printf aren’t supported yet (issue 975)
翻译:如果你想调用C中的printf,那就是 C.printf(). 但是,向pringf这种可变参数个数的函数穿残还没有被支持,所以还不能直接写C.printf(). 只好自己包一下了