仅针对一个标头禁用#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
的情况下编译当然可以,但由于这是完全自动化的构建过程的一部分,我不想这样做。
在之前包含 #undef
ing __GNUC__
和之后包含 #define
ing 的标头是可能的,但我担心包含的标头内部的副作用。
有没有办法只为一个标题禁用#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的主要内容,如果未能解决你的问题,请参考以下文章
发送带有自定义 HTTP 标头的跨域请求时禁用预检 OPTION 请求