Python到C/C++ const char的问题

Eug*_*ene 8 c python const-char

我正在使用一些C++代码扩展Python.

我使用的其中一个功能有以下签名:

int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,
                                char *format, char **kwlist, ...);
Run Code Online (Sandbox Code Playgroud)

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

感兴趣的参数是kwlist.在上面的链接中,给出了如何使用此功能的示例.在示例中,kwlist看起来像:

  static char *kwlist[] = {"voltage", "state", "action", "type", NULL};
Run Code Online (Sandbox Code Playgroud)

当我使用g ++编译它时,我收到警告:

warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)

所以,我可以将静态char*更改为静态const char*.不幸的是,我无法更改Python代码.因此,通过此更改,我得到了不同的编译错误(无法将char**转换为const char**).根据我在这里阅读的内容,我可以打开编译器标志来忽略警告,或者我可以将kwlist定义中的每个常量字符串转换为char*.目前,我正在做后者.有什么其他解决方案?

对不起,如果之前已经问过这个问题.我是新来的.

Tim*_*sch 4

是否PyArg_ParseTupleAndKeywords()期望修改您传入的数据?通常,在惯用的 C++ 中,aconst <something> *指向被调用者只能读取的对象,而<something> *指向被调用者可以写入的对象。

如果PyArg_ParseTupleAndKeywords()期望能够写信给char *您传入的内容,那么除了您在问题中提到的问题之外,您还会遇到一个完全不同的问题。

假设PyArg_ParseTupleAndKeywords不想修改其参数,处理此问题的惯用正确方法是将 kwlist 声明为const char *kwlist[]并使用const_cast在调用时删除其常量性PyArg_ParseTupleAndKeywords(),这将使其看起来像这样:

PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...);
Run Code Online (Sandbox Code Playgroud)