python - 如何在 Mac 上使用 Python 3.8 处理 C 代码中的 tp_print?
问题描述
我需要为 Mac、Windows 和 Linux 上的 Python 3.7 和 3.8 构建与 Python C API 兼容的 C++ 代码。问题是,在 Mac 上,对于 3.8.1,clang 编译器让我对我是否在末尾PyTypeObject
初始化字段(结果消息:)或省略它(结果消息:)的定义感到悲痛。相比之下,Windows 上的 Visual C++ 以任何一种方式接受代码。同时,虽然 Linux 上的 g++ 会抱怨,像 clang 一样,当我初始化字段失败时,至少当我初始化它时它是满意的。tp_print
tp_print is deprecated [-Werror, -Wdeprecated-declarations
missing field 'tp-print' initializer [-Werror,-Wmissing-field-initializers]
tp_print
PyTypeObject
当我初始化时,我正在初始化的代码的尾部看起来像这样tp_print
:
0, // tp_weaklist
0, // tp_del
0, // tp_version_tag
#if PY_MAJOR_VERSION >= 3
0 // tp_finalize
#endif
#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8
,
0 // tp_vectorcall
,
0 // tp_print
#endif
};
当我不初始化tp_print
时,它看起来像这样:
0, // tp_weaklist
0, // tp_del
0, // tp_version_tag
#if PY_MAJOR_VERSION >= 3
0 // tp_finalize
#endif
#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8
,
0 // tp_vectorcall
//,
//0 // tp_print
#endif
};
我发现如果我在定义之前包含此代码:
#ifdef __APPLE__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
#endif
之后的代码:
#ifdef __APPLE__
#pragma clang diagnostic pop
#endif
然后一切正常。有没有更优雅的方法来解决这个问题?Python 开发人员希望我们做什么:初始化tp_print
,还是不初始化?
解决方案
推荐阅读
- c++ - 编写构造函数/析构函数是一种好习惯吗?
- python-3.x - 如果我在带括号的列表中有重复项,我该怎么办
- adobe-brackets - 括号实时预览突然不工作
- java - 如何在我的 Google Glass 应用中录制视频?
- sql - 尝试连接到 Azure 中的 SQL 服务器时在 signalR ASP.NET 中出错
- r - 如何正确地将拟合的线性模型导出到 rds 文件并稍后重新创建?
- java - 如何使用 FIPS BouncyCastle 将 ECPrivateKey 转换为 ECPublicKey?
- office365 - 如何将电子邮件复制到 Office 365 群组?
- sql - 通过同一张表SQL减去组上的两列
- mongodb - MongoDB:嵌套数组的总和