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
关键字)?
register
在此标头的Python 3版本中已经删除了对的使用,因此,如果可能,您应该使用Python 3标头(Python 2将在几年内不再维护)。
否则,您有一些选择。
register
自己的用法(文件中只有四个)。如果针对系统头进行编译,显然这是一个较差的解决方案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] 删除。
我来说两句