【问题标题】:Python to C/C++ const char questionPython 到 C/C++ const char 问题
【发布时间】:2010-04-08 15:32:55
【问题描述】:

我正在用一些 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 *。目前,我正在做后者。还有什么其他解决方案?

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

【问题讨论】:

    标签: python c const-char


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我很确定 PyArg_ParseTupleAndKeywords() 不希望修改 kwlist。你的建议很有帮助。谢谢。
    【解决方案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[] = ".." 将您的字符串复制到可写位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2012-03-22
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多