Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python到C/C++;常量字符问题_Python_C_Const Char - Fatal编程技术网

Python到C/C++;常量字符问题

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

我用一些C++代码扩展Python。< /P> 我正在使用的函数之一具有以下签名:

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>指向被调用方将只读取的对象,而 */Cux>指向被调用方可以写入的对象。

如果
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。你的建议很有帮助。谢谢