Python到C/C++;常量字符问题
我用一些C++代码扩展Python。< /P> 我正在使用的函数之一具有以下签名:Python到C/C++;常量字符问题,python,c,const-char,Python,C,Const Char,我用一些C++代码扩展Python。< /P> 我正在使用的函数之一具有以下签名: int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, char *format, char **kwlist, ...); (链接:) 感兴趣的参数是kwlist。在上面的链接中,给出了如何使用此函数的示例。在示例中,kwlist如下所示: static char *k
int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict,
char *format, char **kwlist, ...);
(链接:)
感兴趣的参数是kwlist。在上面的链接中,给出了如何使用此函数的示例。在示例中,kwlist如下所示:
static char *kwlist[] = {"voltage", "state", "action", "type", NULL};
当我使用g++编译此文件时,我得到警告:
warning: deprecated conversion from string constant to ‘char*’
因此,我可以将静态字符*更改为静态常量字符*。不幸的是,我无法更改Python代码。因此,通过此更改,我得到了一个不同的编译错误(无法将char**转换为const char**)。根据我在这里读到的内容,我可以打开编译器标志来忽略警告,或者我可以将kwlist定义中的每个常量字符串转换为char*。目前,我正在做后者。其他解决方案是什么
对不起,如果以前有人问过这个问题。我是新来的。PyArg_ParseTupleAndKeywords()是否希望修改您传递的数据?通常,在习惯C++中,一个<代码> const */COD>指向被调用方将只读取的对象,而
PyArg_ParseTupleAndKeywords()
希望能够写入您要传递的char*
,那么除了您在问题中提到的问题之外,您还有一个完全不同的问题
假设PyArg_ParseTupleAndKeywords
不想修改其参数,处理此问题的惯用正确方法是将kwlist声明为const char*kwlist[]
并在调用PyArg_ParseTupleAndKeywords()时使用const_cast
删除其常量
这将使它看起来像这样:
PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...);
PyArg_ParseTupleAndKeywords(…,…,…,const_cast(kwlist),…);
七年前有一个公认的答案,但我想补充一个替代方案,因为这个主题似乎仍然相关
如果您不喜欢
const\u 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[]=”。“
将您的字符串复制到一个可写位置。我确信PyArg_ParseTupleAndKeywords()不会修改kwlist。你的建议很有帮助。谢谢