2010-04-08 98 views
8

我正在用一些C++代碼擴展Python。Python to C/C++ const char問題

一個我使用的功能有以下特徵:

int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, 
           char *format, char **kwlist, ...); 

(鏈接:http://docs.python.org/release/1.5.2p2/ext/parseTupleAndKeywords.html

感興趣的參數是kwlist。在上面的鏈接中,給出瞭如何使用這個函數的例子。在這些例子中,kwlist樣子:

static char *kwlist[] = {"voltage", "state", "action", "type", NULL}; 

當我編譯這個使用G ++,我得到警告:

warning: deprecated conversion from string constant to ‘char*’ 

所以,我可以改變靜態的char *靜態爲const char *。不幸的是,我無法更改Python代碼。因此,通過這種改變,我得到了一個不同的編譯錯誤(不能將char **轉換爲const char **)。根據我在這裏閱讀的內容,我可以打開編譯器標誌來忽略警告,或者我可以將kwlist定義中的每個常量字符串轉換爲char *。目前,我正在做後者。什麼是其他解決方案?

對不起,如果這個問題之前已經問過。我是新來的。

回答

4

PyArg_ParseTupleAndKeywords()是否希望修改您傳入的數據?通常,在慣用的C++中,const <something> *指向被調用者只能讀取的對象,而<something> *指向被調用者可以寫入的對象。

如果PyArg_ParseTupleAndKeywords()希望能夠寫入您傳遞的char *,那麼您在問題中提到的問題完全不同。

假設PyArg_ParseTupleAndKeywords不希望修改其參數,處理這個問題將宣佈kwlist爲const char *kwlist[]和使用const_cast調用PyArg_ParseTupleAndKeywords()何時刪除其常量性的慣用正確的方式這將使它看起來像這樣:

PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...); 
+0

我很確定PyArg_ParseTupleAndKeywords()不期望修改kwlist。你的建議很有幫助。謝謝。 – Eugene 2010-04-08 17:02:20

0

有一個從七年前接受的答案,但我想補充一個替代解決方案,因爲這個話題似乎仍然相關。


如果你不喜歡const_cast解決方案,你也可以創建字符串數組的可寫的版本。

char s_voltage[] = "voltage"; 
char s_state[] = "state"; 
char s_action[] = "action"; 
char s_type[] = "type"; 
char *kwlist[] = {s_voltage, s_state, s_action, s_type, NULL}; 

char name[] = ".."將您的字符串複製到可寫位置。