Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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++ 如何禁用没有命令行开关的gcc警告?_C++_C_Gcc_Command Line_Gcc Warning - Fatal编程技术网

C++ 如何禁用没有命令行开关的gcc警告?

C++ 如何禁用没有命令行开关的gcc警告?,c++,c,gcc,command-line,gcc-warning,C++,C,Gcc,Command Line,Gcc Warning,我得到以下警告: warning: 'X' is initialized and declared 'extern' 我可以禁用它。对我来说,更改代码并不是一个好主意,因为我无法控制代码,我只需要编译它。所以我想禁用警告 如果它旁边有一个-WSomeDefect键,那么我可以使用一个-Wno SomeDefect命令行开关,但看起来没有针对此警告的明确开关 如何禁用此类警告 产生此警告的代码无效,应予以修复。C语言要求对此类违反约束的行为发出“诊断”(警告或错误),并且不要求存在任何禁用它们的

我得到以下警告:

warning: 'X' is initialized and declared 'extern'
我可以禁用它。对我来说,更改代码并不是一个好主意,因为我无法控制代码,我只需要编译它。所以我想禁用警告

如果它旁边有一个
-WSomeDefect
键,那么我可以使用一个
-Wno SomeDefect
命令行开关,但看起来没有针对此警告的明确开关

如何禁用此类警告

产生此警告的代码无效,应予以修复。C语言要求对此类违反约束的行为发出“诊断”(警告或错误),并且不要求存在任何禁用它们的方法。我相信(我怀疑很多其他人也这么认为),
extern
是对初始值设定项的约束违反,因为在正常使用中,
extern
只提供声明,而不是定义。但是,根据第6.9.2.1节:

如果对象标识符的声明具有文件作用域和初始值设定项,则该声明是标识符的外部定义

由于语法似乎允许带有初始值设定项的
extern
,因此这确实是一个有效的定义

GCC有一个
-w
选项,该选项可能会关闭警告,但代价是禁用所有警告,而无法覆盖和打开一些警告。如果这是违反约束的行为,并且是修复无效代码的标志,那么这将是有意义的;然而,代码是有效的,GCC绝对应该提供一种机制,不产生关于它的虚假警告

正如Eljay在评论中指出的:

警告分为几类:根据标准要求的诊断信息;常见意外语言滥用/误用的线状静态分析;善意但仍有风格的意见(例如,
-Weffc++
);可能太迂腐和/或细节(例如,
-Weverything
-pedantic
)。后一类应该有“选择退出”的方式来禁用特定的警告,比如OP的情况

GCC通常在大多数情况下都试图遵守这一原则,我认为缺乏禁用这一原则的方法是值得向政府报告的

此警告有数百个实例,它们会淹没编译器输出。很难忽视

如果这是外部库,有办法将此警告减少为单个报告。 我怀疑你只能接受一条警告信息

使用您自己的函数/方法包装此库API。您可以使用不同的名称空间将它们命名为1:1,以避免在使用此API的地方对自己的代码进行复杂修改。这样,只有在包含源文件(包括有问题的头文件)时,才会报告此警告。目的是只包含一次有问题的头文件

这取决于此API的外观,可能更难实现


无论如何,如果这是第三方库,那么这种方法将使模拟该库和为代码编写测试变得更容易。

对于提出的问题的直接答案:

从GCC的源代码可以看出,没有(半)特定的开关来禁用此警告。似乎只有通过禁用所有警告(
-w
)或通过
-issystem
将有问题的代码包含为系统标题才能禁用,这两者在抑制的警告中都是非特定的

GCC上有一个相关的OpenBug报告,对于类似的没有开关的警告情况,还有一个OpenMetaBug报告


如果您不想使用这两种非特定的抑制机制,那么您可能需要在GCC中添加一个附加标志,或者等待Bug被处理,以禁用此特定警告。

没有任何特定标志来禁用此功能,这很不幸,但是有
-w
标志将禁用所有警告,无法重新启用它们

从:

-w

禁止所有警告信息


但是这里更好的选择是从变量声明/定义中删除
extern
。这样,编译器就知道变量是在翻译单元中定义的。您可以联系代码的所有者,看看他们是否可以更改代码。

如果您无法控制代码,它是一个库吗?在这种情况下,您可以/应该通过
-isystem
而不是
-I
(对于GCC和clang)将其包括在内,以禁用其中的所有警告。我也不同意这个警告“没什么大不了的”:它可能是无害的,但与答案所说的不同,我认为它通常指向编写的代码中的错误,并表明作者不理解
extern
说明符的语义。所以这是一个值得注意的有效警告。@MarekR,因为这样你就不能使用
-Werror
。您应该使用
-Werror
。您可以使用
-w
禁用所有警告,然后结束。@MarekR我不同意。在这种情况下,请修复代码(并且不要使用实验性警告;因此,您不应该在生产中使用
-Weverything
。@MarekR有数百个此警告的实例,它们会淹没编译器输出。很难忽视。很好的回答!警告分为几类:根据标准要求的诊断信息;常见意外语言滥用/误用的线状静态分析;善意但仍有风格的意见(例如,
-Weffc++
);可能太迂腐和/或细节(例如,
-Weverything
-pedantic
)。后一类应该有“选择退出”的方式来禁用特定的警告,例如在OP的案例中。@Eljay:谢谢。在答案中添加一个附加注释。