python2.7(2.7.13)的最新版本包含一个使用register
关键字的头unicodeobject.h
。我的理解是C++ 17有这个{a1}这个关键字。当使用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
关键字)?在
在这个头的python3版本中,
register
的用法已经被删除了,所以如果可能的话,您应该使用python3头(python2在几年内将不再被维护)。在否则,你有几个选择。在
register
的用法(文件中只有四个)。如果根据系统头进行编译,这显然是一个糟糕的解决方案register
关键字只有4种用法,所以您可以考虑使用它。在禁用寄存器警告。您可以通过在命令行上传递标志
-Wno-register
对整个项目执行此操作,也可以通过执行以下操作为此标头禁用它:这将保存当前的警告设置,忽略该标头的
register
警告,然后在包含标头后恢复原始警告设置。虽然pragma是GCC,但Clang也会理解这个pragma并按照您的意愿行事。相关问题 更多 >
编程相关推荐