Python C++扩展编译器警告

2024-05-18 09:40:33 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我在C++扩展中有类似的事情:

char* kwlist[] = {"x", "W"};
if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OO", kwlist, &x, &W)) return NULL;

编译器抱怨:

^{pr2}$

消除此警告的最佳方法是什么?在

我试过了:

^{3}$

但这失败了:

候选函数不可行:没有从“const char[2]”到“char*”的已知转换


Tags: 方法警告returnif编译器args事情null
1条回答
网友
1楼 · 发布于 2024-05-18 09:40:33

看起来你试图在某种程度上使Python的capi不正确,即使通过在编译器上打开警告来间接地做到这一点。你有几个选择。(请注意,我无法在我的编译器中重现警告,因此请仔细检查我的建议,以实际解决问题。)

  • 抛弃创造的警告:

    char* kwlist[] = { const_cast<char*>("x"), const_cast<char*>("W") };
    if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OO", kwlist, &x, &W)) return NULL;
    
  • 排除使用错误:

    ^{2美元
  • 根据需要使事物可变:

    char kw_x[] = "x";
    char kw_W[] = "W";
    char* kwlist[] = { kw_x, kw_W };
    if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OO", kwlist, &x, &W)) return NULL;
    
  • 在全局或本地使特定警告静音:

    本地警告抑制的确切代码取决于编译器。我列举了以下两个常见案例:

    GCC(谢谢Matt Joiner!)在

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wdeprecated-writable-strings"
    takes_ppchar(kwlist);         /* no diagnostic for this one */
    #pragma GCC diagnostic pop
    

    Visual Studio

    #pragma warning(push)
    #pragma warning(disable : ####)
    code_causing_warning(####)
    #pragma warning(pop)
    

丢弃const不是普遍安全的,因此如果PyArg_ParseTupleAndKeywords实际以非常数方式使用内容,则前两种方法中的任何一种都可能导致运行时失败。在

如果您强烈怀疑PyArg_ParseTupleAndKeywords以const-safe的方式使用参数(请求的权限比使用的多),那么大多数方法都比技术上正确的第三种方法要简单。在

相关问题 更多 >