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

8 投票
2 回答
1797 浏览
提问于 2025-04-15 21:23

我正在用一些C++代码来扩展Python。

我正在使用的一个函数有以下的参数定义:

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*’

所以,我可以把static char*改成static const char*。可惜的是,我不能改动Python的代码。因此,做了这个改动后,我又遇到了一个不同的编译错误(不能把char**转换成const char**)。根据我在这里读到的内容,我可以开启编译器的选项来忽略这个警告,或者我可以把kwlist定义中的每个常量字符串转换成char *。目前,我正在做后者。还有其他解决方案吗?

抱歉如果这个问题之前有人问过。我是新手。

2 个回答

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[] = ".." 这行代码会把你的字符串复制到一个可以修改的位置。

4

函数 PyArg_ParseTupleAndKeywords() 是否会修改你传入的数据?通常在标准的 C++ 中,const <something> * 表示这个对象只能被读取,而 <something> * 则表示这个对象可以被修改。

如果 PyArg_ParseTupleAndKeywords() 期望能够修改你传入的 char *,那你就遇到了一个比你问题中提到的更复杂的问题。

假设 PyArg_ParseTupleAndKeywords 不想修改它的参数,那么处理这个问题的正确方式是将 kwlist 声明为 const char *kwlist[],然后在调用 PyArg_ParseTupleAndKeywords() 时使用 const_cast 来去掉它的常量属性,这样看起来会是这样的:

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

撰写回答