仅针对一个标头禁用#warning

Posted

技术标签:

【中文标题】仅针对一个标头禁用#warning【英文标题】:Disable #warning just for one header 【发布时间】:2015-09-10 11:05:10 【问题描述】:

在我尝试移植的 C/C++ 代码中,包含一个已弃用的系统标头:

从标题:

#ifdef __GNUC__
#warning "this header is deprecated"
#endif

当我们在这里用gcc -Wall -Werror 编译时,编译停止。 从长远来看,最好使用已弃用的函数,但现在我只想禁用此警告。

在没有-Werror 的情况下编译当然可以,但由于这是完全自动化的构建过程的一部分,我不想这样做。

在之前包含 #undefing __GNUC__ 和之后包含 #defineing 的标头是可能的,但我担心包含的标头内部的副作用。

有没有办法只为一个标题禁用#warning 或放松-Werror

【问题讨论】:

没有“C/C++代码”之类的东西。 事物被弃用是有原因的。与其试图解决问题,不如消除问题并停止使用已弃用的标头。如果他们弃用了标头,那么肯定有更好、更现代的方式来实现您的目标。 @LightnessRacesinOrbit:它是 C 和 C++ 代码的混合体。 @ThomasErker:这没有任何意义,除非您指的是一个由不同的 C 和 C++ 编写的翻译单元组成的程序......但这不是一个最小的测试用例。你的意思是说它是主要使用 C 习惯用法的 C++ 代码吗? @LightnessRacesinOrbit:C-ish C++ 中的一个库,必须由 C 和 C++ 使用,以及一些必须可编译为 C 和 C++ 的帮助程序/示例程序。所以解决方案必须与 C 和 C++ 兼容。我期待“C/C++ 代码”以与“Perl/Python 代码”相同的方式被理解。有更好的措辞吗? 【参考方案1】:

您可以使用(特定于 GCC)diagnostic pragma 来做到这一点

如果您将包含以下内容包围,它将禁用由#warning 引起的任何警告。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcpp"
#include "header.h"
#pragma GCC diagnostic pop

请注意,如果您将上面的 ignored 更改为 warning,编译器仍会打印警告 - 它只是不会对它们的 -Werror 标志起作用。

【讨论】:

这仅适用于 c,不适用于 c++:gcc.gnu.org/bugzilla/show_bug.cgi?id=80650【参考方案2】:

这恰好禁用了一种类型的警告,#warning 指令,所以我认为这是解决这个问题的最安全的方法:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-W#warnings"
#include <evilheader.h>
#pragma GCC diagnostic pop

编辑:抱歉,我的系统实际上是 gcc,所以可能无法与您的正版 gcc 一起使用)

【讨论】:

我刚刚在 gcc 4.7.2 上尝试过,恐怕这是一个特定于 clang 的功能。 @SimonGibbons 是的。有趣的是,clang 如何模仿 GCC(例如 pragma GCC diagnostic),但它比 GCC 本身做得更好:) 赞成,即使它不适用于正版 gcc,因为我的 gcc 也真的很响。 等一下.. 一些系统将 gcc 链接到 Clang?!? @LightnessRacesinOrbit 在 OS X 上是的。 Clang 在命令行级别是 99% 兼容的,所以为了让你的开源包构建无头痛,如果前者不可用,它只需将 gcc 链接到 clang。

以上是关于仅针对一个标头禁用#warning的主要内容,如果未能解决你的问题,请参考以下文章

仅针对特定视图禁用手势识别器

如何仅针对该应用禁用来自应用的推送通知?

如何在iOS 7中仅针对一个视图禁用后退手势

发送带有自定义 HTTP 标头的跨域请求时禁用预检 OPTION 请求

如何通过 XML 配置仅针对特定 URL 模式在 Spring Security 4 中禁用 CSRF?

为单个连接禁用 SSLHandshakeException