2024-05-18 09:40:33 发布
网友
char* kwlist[] = {"x", "W"}; if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OO", kwlist, &x, &W)) return NULL;
编译器抱怨:
消除此警告的最佳方法是什么?在
我试过了:
但这失败了:
候选函数不可行:没有从“const char[2]”到“char*”的已知转换
看起来你试图在某种程度上使Python的capi不正确,即使通过在编译器上打开警告来间接地做到这一点。你有几个选择。(请注意,我无法在我的编译器中重现警告,因此请仔细检查我的建议,以实际解决问题。)
抛弃创造的警告:
char* kwlist[] = { const_cast<char*>("x"), const_cast<char*>("W") }; if (!PyArg_ParseTupleAndKeywords(args, kwrds, "OO", kwlist, &x, &W)) return NULL;
排除使用错误:
根据需要使事物可变:
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
如果您强烈怀疑PyArg_ParseTupleAndKeywords以const-safe的方式使用参数(请求的权限比使用的多),那么大多数方法都比技术上正确的第三种方法要简单。在
看起来你试图在某种程度上使Python的capi不正确,即使通过在编译器上打开警告来间接地做到这一点。你有几个选择。(请注意,我无法在我的编译器中重现警告,因此请仔细检查我的建议,以实际解决问题。)
抛弃创造的警告:
排除使用错误:
^{2美元根据需要使事物可变:
在全局或本地使特定警告静音:
本地警告抑制的确切代码取决于编译器。我列举了以下两个常见案例:
GCC(谢谢Matt Joiner!)在
Visual Studio
丢弃const不是普遍安全的,因此如果
PyArg_ParseTupleAndKeywords
实际以非常数方式使用内容,则前两种方法中的任何一种都可能导致运行时失败。在如果您强烈怀疑
PyArg_ParseTupleAndKeywords
以const-safe的方式使用参数(请求的权限比使用的多),那么大多数方法都比技术上正确的第三种方法要简单。在相关问题 更多 >
编程相关推荐