亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么不允許將接口{}轉換為 cgo 類型?

為什么不允許將接口{}轉換為 cgo 類型?

Go
絕地無雙 2022-09-19 10:45:11
這更像是一個技術問題,而不是一個真正的問題。由于我們在 cgo 中沒有可變參數函數,并且目前沒有有效的解決方案,我想知道是否有可能將接口{} 轉換為 cgo 類型。因此,這將使我們能夠擁有更多的動態函數。我很確定我們甚至不允許以動態方式為導出(//export)函數中的參數分配類型,也不允許使用省略號。那么,所有這些限制背后的原因是什么呢?感謝您的回答。import "C"//export Foofunc Foo(arg1, arg2, arg3) {    }
查看完整描述

1 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

C 編譯器允許(但不是必需的)使用不同的返回機制返回不同的類型。例如,某些 C 編譯器可能會在寄存器中返回結果,在寄存器中返回結果,在寄存器中返回整數結果,在寄存器中返回指針結果。float%f0double%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 為單位的浮點數。


查看完整回答
反對 回復 2022-09-19
  • 1 回答
  • 0 關注
  • 78 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號