2016-01-20 165 views
0

当我运行此代码时,我期望打印结果如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); 
} 
+1

转到结构'S'和C结构'S'很可能不是您的系统上兼容。你不能把一个指针看作另一个指针。创建C结构类型的对象 - 您可以直接从Go创建和使用C结构。 – andlabs

+0

在需要与C结构匹配的结构中使用特定大小的类型,如'int64'。在这种情况下,使用int64,或从C定义中获取结构。由于您无法通过cgo访问typedef结构,因此通常使用C封装来访问它们,而不是在Go中手动匹配结构。这样你可以让cgo自动生成它们,而不是手动检查大小和对齐方式。 – JimB

回答

0

感谢征求意见。

我能得到预期的结果与下面的代码

main.go:

package main 

/* 
#include "c.h" 

*/ 
import "C" 

import (
    "unsafe" 
) 

type S struct { 
    A int64 // 64bit int 
    B int64 // 64bit 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 long int A; // 64bit int 
    long long int B; // 64bit int 
} S; 

extern void gostruct(S *struct_s) { 
    printf("{A: %lld, B: %lld}\n", struct_s->A, struct_s->B); 
} 

我想结构领域必须使用语言之间的相同的类型。 在问题代码中,struct字段类型不相同。 (C结构:32位int,结构:64位int)

在答案代码中,结构字段在语言之间是相同的。 (包括结构:64位INT)

请注意,我的建筑是darwin/amd64

+0

这仍然是错误的答案。它会在Windows上失败。正确的答案是创建一个'C.S'并直接使用它;不要试图强制一个Go结构的项目肯定会有不同的大小或对齐到一个C结构。 – andlabs