Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 仅对一个标题禁用#警告_C_Gcc_C Preprocessor_Preprocessor Directive - Fatal编程技术网

C 仅对一个标题禁用#警告

C 仅对一个标题禁用#警告,c,gcc,c-preprocessor,preprocessor-directive,C,Gcc,C Preprocessor,Preprocessor Directive,在我尝试移植的C/C++代码中,包含一个不推荐使用的系统头: 从标题: #ifdef __GNUC__ #warning "this header is deprecated" #endif 当我们在这里使用gcc-Wall-Werror编译时,编译停止。 从长远来看,替换不推荐使用的函数是最好的,但现在我只想禁用此警告 不用-Werror编译当然可以,但由于这是完全自动化构建过程的一部分,我不希望这样做 在标题前面加上#undefingu GNUC_u,在标题后面加上#define是可能的,

在我尝试移植的C/C++代码中,包含一个不推荐使用的系统头:

从标题:

#ifdef __GNUC__
#warning "this header is deprecated"
#endif
当我们在这里使用
gcc-Wall-Werror
编译时,编译停止。 从长远来看,替换不推荐使用的函数是最好的,但现在我只想禁用此警告

不用
-Werror
编译当然可以,但由于这是完全自动化构建过程的一部分,我不希望这样做

在标题前面加上
#undef
ing
u GNUC_u
,在标题后面加上
#define
是可能的,但我担心标题里面的副作用

是否有一种方法可以仅对一个标题禁用
#警告
或放松
-Werror

如果您在include周围加上以下内容,它将禁用由
#warning
引起的任何警告

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

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

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

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-W#warnings"
#include <evilheader.h>
#pragma GCC diagnostic pop
#pragma GCC诊断推送
#pragma GCC诊断被忽略“-W#警告”
#包括
#pragma-GCC-diagnostic-pop

编辑:抱歉,原来gcc实际上在我的系统上发出叮当声,因此可能无法与您真正的gcc一起工作)

我刚刚在gcc 4.7.2中尝试了这一点,我担心这似乎是一个特定于叮当声的功能。@SimonGibbons是的。clang如何模仿GCC(例如,
pragma GCC diagnostic
)很有趣,但它是否比GCC本身更好:)升级,即使它不能与真正的GCC一起工作,因为我的GCC也是非常clang。等等。。有些系统将gcc链接到叮当声@OS X上的LightnessRacesinOrbit是的。Clang在命令行级别上99%兼容,因此,为了使您的开源软件包构建不再令人头痛,如果前者不可用,只需将gcc链接到Clang即可。没有“C/C++代码”这样的东西。这是不推荐使用的原因。与其尝试破解问题,不如消除问题并停止使用不推荐的标题。如果他们不喜欢标题,那么肯定有一个更好的,更现代的方法来完成你的目标。@ LeNNESSRACESEnLoo:这是C和C++代码的混合。@ ToMaseRek:这没有意义,除非你指的是一个由C和C++写的个人翻译单元,非常有价值…但这不是一个最小的测试用例。你是说,C++代码主要使用C语言吗?@ LexNeasraceSeNe轨道:C-SiC++中的一个库,它必须被C和C++使用,并且一些辅助程序/示例程序必须编译成C和C++。因此,解决方案必须是C和C++兼容。我希望“C/C++代码”的理解方式与“Perl/Python代码”相同。有更好的措辞吗?这只适用于c,而不适用于c++: