当我运行此代码时,我期望打印结果如A: 4, B: 89
。 但实际上,不显示任何东西。不在cgo中显示printf结果
为什么这个程序不显示结果到标准输出?
main.go:
package main
/*
#include "c.h"
*/
import "C"
import (
"unsafe"
)
type S struct {
A int
B int
}
func main() {
s := &S{A: 4, B: 89}
pass_to_c := (*C.S)(unsafe.Pointer(s))
C.gostruct(pass_to_c)
}
c.h
#include <stdio.h>
#include <stdlib.h>
typedef struct {
long int A;
long int B;
} S;
extern void gostruct(S *struct_s) {
printf("A: %ld, B: %ld\n", struct_s->A, struct_s->B);
}
转到结构'S'和C结构'S'很可能不是您的系统上兼容。你不能把一个指针看作另一个指针。创建C结构类型的对象 - 您可以直接从Go创建和使用C结构。 – andlabs
在需要与C结构匹配的结构中使用特定大小的类型,如'int64'。在这种情况下,使用int64,或从C定义中获取结构。由于您无法通过cgo访问typedef结构,因此通常使用C封装来访问它们,而不是在Go中手动匹配结构。这样你可以让cgo自动生成它们,而不是手动检查大小和对齐方式。 – JimB