8

我正在用一些 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*’

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

对不起,如果这个问题以前被问过。我是新来的。

4

2 回答 2

4

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

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

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

PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...);
于 2010-04-08T15:50:35.157 回答
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[] = ".."您的字符串复制到可写位置。

于 2017-11-29T13:10:07.213 回答