2011-06-06 86 views
4

我明白如何用ctypes在Python中定義結構,但我似乎無法找到關於如何處理基本別名的任何文檔。例如64-bit integers in SQLite用ctypes映射基本的typedef別名?

#ifdef SQLITE_INT64_TYPE 
    typedef SQLITE_INT64_TYPE sqlite_int64; 
    typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; 
#elif defined(_MSC_VER) || defined(__BORLANDC__) 
    typedef __int64 sqlite_int64; 
    typedef unsigned __int64 sqlite_uint64; 
#else 
    typedef long long int sqlite_int64; 
    typedef unsigned long long int sqlite_uint64; 
#endif 
typedef sqlite_int64 sqlite3_int64; 
typedef sqlite_uint64 sqlite3_uint64; 

根據構建選項,基本類型是不同的。在這種情況下,我認爲我可以假設這種類型是c_longlong,但這是處理這種情況的正確方法嗎?

回答

3

雖然這當然不是「正確的」方式來處理這個問題,但使用C API而不是​​這是唯一的解決方案。在運行​​時,typedef信息已被刪除 - 它不會在編譯庫中顯示爲符號。

+0

通過「使用C API而不是ctypes」,你的意思是從其他一些通過Python C API公開函數的C代碼實際調用原始C庫? – technomalogical 2011-06-06 15:47:06

+0

Ivc表示將代碼編寫爲Python的C擴展,假設SQLite構建在您構建C擴展的同一臺計算機上,將允許您在SQLite代碼中執行相同的預處理器條件檢查。 (http://docs.python.org/extending/index.html或http://docs.python.org/py3k/extending/index.html或其他地方,取決於你使用的是什麼版本的Python 。) – JAB 2011-06-06 15:56:04