Когда я запустил этот код, я ожидал результата печати, например A: 4, B: 89
. Но на самом деле ничего не отображает.Не отображает результат printf в cgo
Почему эта программа не отображает результат для стандартного вывода?
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);
}
The Go 'структура S' и C структура' S', очень вероятно, не совместимы с вашей системой. Вы не можете рассматривать указатель на один как указатель на другой. Вместо этого создайте объект типа структуры C - вы можете создавать и использовать структуру C непосредственно из Go. – andlabs
Используйте типы определенного размера, такие как 'int64', в структуре, которая должна соответствовать структуре C. В этом случае используйте int64 или получите структуру из определения C. Поскольку вы не можете получить доступ к структурам typedef через cgo, обычно нужно сделать оболочку C для доступа к ним, а не сопоставлять структуру вручную в Go. Таким образом вы можете позволить cgo генерировать их автоматически, а не вручную проверять размер и выравнивание. – JimB