2017-07-24 107 views
0

當我嘗試從包main傳遞C.int給函數在一個輔助包叫做common,我得到以下錯誤:如何在go包之間傳遞C對象?

main.go:24: cannot use argc (type C.int) as type common.C.int in argument to common.GoStrings 

common.go

/* 
    ... 
*/ 
import "C" 

... 

func GoStrings(argc C.int, argv **C.char) (args []string) { 
    // do stuff 
} 

main.go

/* 
#cgo LDFLAGS: -lpam -fPIC 
#define PAM_SM_AUTH 

#include <security/pam_appl.h> 
*/ 
import "C" 

... 

func pam_sm_authenticate(pamh *C.pam_handle_t, flags, argc C.int, argv **C.char) C.int { 
    args := common.GoStrings(argc, argv) 
    ... 
} 

有什麼辦法來回傳遞這些對象嗎?我已經嘗試過將類型轉換爲例如common.C.int,但這似乎不是有效的語法。我希望能夠從多個不同的主程序中調用GoStrings,看起來這應該是可以允許的。

回答

3

不幸的是,你不能在包之間傳遞C類型。您需要在導入C類型的包中執行任何必需的類型轉換。由於每documentation

Cgo translates C types into equivalent unexported Go types. Because the translations are unexported, a Go package should not expose C types in its exported API: a C type used in one Go package is different from the same C type used in another.

如果您有使用常用的C翻譯方法,可以考慮使用go generate用一個腳本在每個地方它是從一個主源文件所需的程序包來創建這些。沒有解決方案那麼好,而是比手動更新多個包中的文件要好得多。

+0

對於這種情況,我通常會傳遞'unsafe.Pointer'。這有效,但你最好確保做到理智和錯誤檢查! –