2010-05-15 49 views

回答

2

PyUnicodeObjectPyObject一個子集所以不應該有它傳遞任何問題。

+0

...除了當然C編譯器不可能知道(沒有子集,子類,繼承等的概念),所以你需要一個強制轉換(指向指針強制轉換的指針),正如我在我的答案中解釋的那樣。 – 2010-05-15 14:19:17

3

你可以只使用一個投在C代碼用於此目的:

PyUnicodeObject *p = ...whatever...; 
callsomefun((PyObject*)p); 

所有的各種具體,具體類型PyWhateverObject可以被看作是的PyObject「源自」。現在C確實有繼承的概念,所以它沒有「派生」的概念,但是Python虛擬機非常簡單地合成它,通過確保每個這樣的對象的內存佈局「開始於」一個頭,這個頭與一個PyObject結構是完全對應的有一個宏)。這保證了指針的正常C轉換(雖然技術上「風險」,因爲編譯器無法檢查正確性 - 如果你投錯了東西,你只會在運行時崩潰;-)在指向PyObject的指針以及指向具體的具體Python類型結構的指針。

+0

聯繫我電話 PyUnicodeObject類型 - > PyBytesObject類型 PyUnicodeObject * p = ... whatever ...; callafun((PyByteObject *)p); 出現總線錯誤。 – dizgam 2010-05-15 14:21:05

+0

@kamol,'PyUnicodeObject'和'PyBytesObject'中的每一個都是'PyObject'的_separate_「概念子類」,所以演員陣容不會在那裏工作(而且這不是**你在Q中提出的問題,所以我建議你編輯它以涵蓋你的**真實**問題)。有關您當前非常具體且完全不同的問題,請參閱http://docs.python.org/py3k/c-api/unicode.html#PyUnicode_Encode(並確保爲您創建的字節對象使用本地變量在調用完成之後,必須將其遞減,除非你所調用的函數是一個很少見的函數,它可以引用_steals_)。 – 2010-05-15 14:41:15

相關問題