【问题标题】:C++ 17 compatability with Python 2.7C++ 17 与 Python 2.7 的兼容性
【发布时间】:2018-09-16 11:34:17
【问题描述】:

最新版本的 python 2.7 (2.7.13) 包含一个使用 register 关键字的标题 unicodeobject.h。我的理解是 C++ 17 有 removed 这个关键字。当使用 C++ 17 对该头文件进行编译时,会触发一系列警告,包括:

/opt/anaconda/include/python2.7/unicodeobject.h:534:24: warning: ISO C++1z does not allow ‘register’ storage class specifier [-Wregister]
 register PyObject *obj,     /* Object */
                    ^~~
/opt/anaconda/include/python2.7/unicodeobject.h:553:24: warning: ISO C++1z does not allow ‘register’ storage class specifier [-Wregister]
 register PyObject *obj      /* Object */
                    ^~~
/opt/anaconda/include/python2.7/unicodeobject.h:575:29: warning: ISO C++1z does not allow ‘register’ storage class specifier [-Wregister]
 register const wchar_t *w,  /* wchar_t buffer */
                         ^
/opt/anaconda/include/python2.7/unicodeobject.h:593:23: warning: ISO C++1z does not allow ‘register’ storage class specifier [-Wregister]
 register wchar_t *w,        /* wchar_t buffer */

也就是说,尽管有这些警告,我仍然能够编译和运行 python 扩展。继续这样做是否安全?有没有办法(除了明确忽略警告)来解决这些消息,例如升级到 2.7 的不同版本(尽管如前所述,最新版本似乎仍然使用 register 关键字)?

【问题讨论】:

  • register 是一个优化提示。编译器可能会忽略它。您可以随时更改构建脚本以添加 -Dregister=(删除它)或添加 -Wno-register
  • 作为一个小提示,Python 2.7(和一般的 Python 2)将达到他们的end of life by the end of 2019,所以如果 Python 3 没有发生这种情况,您可能需要考虑切换到它。跨度>

标签: python c++ python-2.7 c++17


【解决方案1】:

register 的使用已经在这个头文件的 Python 3 版本中被移除了,所以如果可能的话,你应该使用 Python 3 头文件(Python 2 几年后将不再维护)。

否则,您有几个选择。

  • 如果您正在使用这些标头的本地版本(例如随模块分发),您可以简单地自己删除 register 的使用(文件中只有四个)。如果您针对系统标头进行编译,这显然是一个糟糕的解决方案
  • CPython 实际上是用 C 编写的,而不是 C++,C 既没有弃用也没有删除 register 关键字,所以如果你正在编译的模块是用 C 编写的,你可以使用 C 编译器(例如 gcc)而不是 C++ 编译器。 (我希望该模块是用 C++ 编写的,所以这可能不是一个选项)。
  • 忽略警告。正如我所提到的,register 关键字只有 4 种用途,因此您可以考虑使用它。
  • 禁用注册警告。您可以通过在命令行上传递标志 -Wno-register 来为整个项目执行此操作,或者您可以通过执行以下操作禁用此标头:

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wregister"`
    #include <unicodeobject.h> // or whatever header includes unicodeobject.h
    #pragma GCC diagnostic pop
    

    这将保存当前的警告设置,忽略该标题的register 警告,然后在包含标题后恢复原​​始警告设置。虽然 pragma 说的是 GCC,但 Clang 也会理解这个 pragma 并按照您的意愿行事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2021-10-23
    • 2019-02-06
    • 2015-12-23
    • 2016-06-10
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多