C ++ 17与Python 2.7的兼容性

mcguip:

python 2.7(2.7.13)的最新版本包含unicodeobject.h使用register关键字的标头我的理解是C ++ 17 删除了此关键字。使用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关键字)?

SJL:

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标题警告,然后在包含标题后恢复原​​始警告设置。尽管编译指示说了GCC,但Clang也会理解该编译指示并按照您的意愿进行操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章