1 回答

TA貢獻1788條經驗 獲得超4個贊
C 編譯器允許(但不是必需的)使用不同的返回機制返回不同的類型。例如,某些 C 編譯器可能會在寄存器中返回結果,在寄存器中返回結果,在寄存器中返回整數結果,在寄存器中返回指針結果。float
%f0
double
%f0:f1
%d0
%a0
對于為 Go 編寫 Cgo 接口的人來說,這意味著他們必須以不同的方式處理每種 C 函數。換句話說,不可能寫:
generic_type Cfunc(ctype1 arg1, ctype2 arg2) { ... }
我們必須知道,在編譯時,返回浮點數/雙精度型<某種整數類型>/<某種指針類型>以便我們可以獲取正確的寄存器并將其(或它們的)值填充到 Cgo 返回值槽中,Cgo 接口可以在其中獲取它并包裝起來以便在 Go 中使用。Cfunc
作為實現 Cgo 包裝器以調用 C 函數的 Go 編譯器的用戶,這對您來說意味著您必須知道正確的類型。沒有一般的答案;沒有辦法在這里使用。您必須將精確、正確的類型傳達給 Cgo 層,以便 Cgo 層可以使用該精確、正確的類型信息在編譯時生成正確的機器代碼。interface{}
如果 C 編譯器編寫者有某種方式標記其代碼,例如,在鏈接時,鏈接器可以拉入正確的“將正確的寄存器保存到內存”位置,這將使 Cgo 包裝器作者能夠使用鏈接器在鏈接時自動查找 C 函數的類型。但是這些C編譯器沒有為鏈接器提供這種能力。
您的特定編譯器是其中之一嗎?我們不知道:你沒有說。但:
我很確定我們甚至不允許以動態方式為導出(//export)函數中的參數分配類型,也不允許使用省略號。那么,所有這些限制背后的原因是什么呢?
這是正確的,上面的(略帶理論性的)例子就是一個原因。(我通過混合來自68k C編譯器和SPARC C編譯器的實際技術來構造此示例,因此我認為沒有任何單獨的C編譯器。但是過去確實存在這樣的例子,SPARC 系統仍然返回 %o0 的整數,或者在 V8 SPARC 上返回 %o0+%o1 的整數,而不是以 %f0 或 %f0+%f1 為單位的浮點數。
- 1 回答
- 0 關注
- 78 瀏覽
添加回答
舉報