Python到C/C++常量字符问题
我正在用一些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 个回答
七年前有一个被认可的回答,但我想提供一个替代方案,因为这个话题似乎仍然很重要。
如果你不喜欢 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[] = ".."
这行代码会把你的字符串复制到一个可以修改的位置。
函数 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), ...);