关闭"'register'存储类别限定符已经被弃用"警告

19

最近更新了Xcode 5.1后,我们的代码库中出现了大量新警告 -
这显然与更新的clang版本有关,它现在会警告在C++11源文件中使用register存储类说明符,因为它已经被C++11弃用:

/Users/me/Documents/Sources/boost/boost/log/attributes/attribute_set.hpp:288:9: 'register' storage class specifier is deprecated

现在我们希望抑制警告,针对那些我们无法更改的代码 - 比如上面例子中的 BOOST 源码。
我可以找到编译器标志来打开警告(-Wdeprecated-register),但是是否有一个相反的选项可以从 Xcode 设置中禁用警告呢?

1
一个可能的解决方案是向Boost团队发送报告,停止使用register和其他已弃用的东西:P - Manu343726
是啊...我猜我们只能等几年所有boost libs才会发生这种情况;-) - Jay
@KitsuneYMG,那个实际上会导致编译器错误,也就是说,register关键字不再被识别。 - Jay
@Jay -Dregister= - S.S. Anne
3个回答

30
一般情况下,在选项前加上no-可以将其关闭。因此,如果-Wdeprecated-register启用了警告,则-Wno-deprecated-register应该将其禁用。
另外,在许多编译器上,您可以在代码中使用编译指示(或类似的内容)来禁用特定头文件中的警告,同时使它们针对您自己的代码保持启用。它们是特定于编译器的;对于Clang来说,大概是这样的:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-register"
#include "dodgy.hpp"
#pragma clang diagnostic pop

(对于GCC,这些#pragma命令是相同的,只需用GCC替换clang即可。我不知道其他编译器是否也适用。)


10

这同样有效。

#if __cplusplus > 199711L
#define register      // Deprecated in C++11.
#endif  // #if __cplusplus > 199711L

9

在这里,抑制警告是错误的工具。 当包含不属于您的代码时,请使用-isystem标志,并且它将在该代码中不生成任何警告。


1
不错的技巧,但是对于我们的目的来说,“-isystem”太宽泛了:我们需要具体关闭仅仅寄存器警告。 - Jay
在Xcode中,警告是在项目级别上禁用的。在那个特定的项目中,所有第三方库都被放置。除了boost之外的东西,我们想要关注并不只是忽略所有警告。并不是每个第三方库都经过像boost库那样彻底的同行评审过程,所以最好确保一下。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接