如何在Mac上使用Python3.8处理C代码中的tp_打印?

如何在Mac上使用Python3.8处理C代码中的tp_打印?,python,c,python-3.x,Python,C,Python 3.x,我需要构建与Python C API兼容的C++代码,用于Python 3.7和3.8,在MAC、Windows和Linux上兼容。问题是在Mac上,对于3.8.1,clang编译器让我对PyTypeObject定义感到悲伤,不管我是在末尾初始化tp_print字段(结果消息:tp_print被弃用[-Werror,-Wdeprecated声明),还是忽略它(结果消息:缺少字段“tp print”初始值设定项)相比之下,Windows上的Visual C++可以任意接受代码。同时,虽然Linux

我需要构建与Python C API兼容的C++代码,用于Python 3.7和3.8,在MAC、Windows和Linux上兼容。问题是在Mac上,对于3.8.1,clang编译器让我对
PyTypeObject
定义感到悲伤,不管我是在末尾初始化
tp_print
字段(结果消息:
tp_print被弃用[-Werror,-Wdeprecated声明
),还是忽略它(结果消息:
缺少字段“tp print”初始值设定项)相比之下,Windows上的Visual C++可以任意接受代码。同时,虽然Linux上的G+可以像CLAN一样抱怨,但是当我初始化了<代码> TPyPrime<代码>字段时,当初始化时,它至少是满意的。
我正在初始化的
PyTypeObject
代码的尾部在初始化
tp\u 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\u 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\u print
,还是不初始化?

tp\u print
已经不存在了。它被
tp\u vectorcall\u offset
取代了……文档这么说,但很明显,标题中的实际结构定义是这样的看起来不一样。我认为你最好的选择是关闭Wmissing字段初始值设定项。Python C API的设计没有考虑到这个警告。如果我为clang关闭Wmissing字段初始值设定项,我需要为g++关闭类似的消息。我不介意这样做,但我只是提到它。
tp_print
不再存在。它被替换为
tp\u vectorcall\u offset
…好吧,文档这么说,但是很明显,标题中的实际结构定义看起来不同。我认为最好的选择是关闭Wmissing字段初始值设定项。Python C API在设计时没有考虑到该警告。如果我为clang关闭Wmissing字段初始值设定项,我需要我不介意这样做,但我只是提一下。