用Python 2.7实现C++ 17的兼容性

2024-09-30 22:26:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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关键字)?在


Tags: registerincludenotisostorageanacondaclassopt
1条回答
网友
1楼 · 发布于 2024-09-30 22:26:34

在这个头的python3版本中,register的用法已经被删除了,所以如果可能的话,您应该使用python3头(python2在几年内将不再被维护)。在

否则,你有几个选择。在

  • 如果您正在使用这些头的本地版本(例如,与模块一起分发),您只需删除register的用法(文件中只有四个)。如果根据系统头进行编译,这显然是一个糟糕的解决方案
  • cPython实际上是用C编写的,而不是C++,C既没有表示也没有删除^ {CD1}}关键字,所以如果编译的模块是用C编写的,那么你可以使用C编译器(例如^ {CD4}})而不是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并按照您的意愿行事。

相关问题 更多 >