2016-01-20 32 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