我收到了以下警告:
warning: 'X' is initialized and declared 'extern'
而且它 看起来不是什么大问题,我可以禁用它。在我的情况下更改代码并不是一个好主意,因为我无法控制代码,我只需要编译它。所以我想要禁用这个警告。
如果它旁边有一个-WSomeDefect
键,那么我可以使用-Wno-SomeDefect
命令行开关,但看起来没有明显的开关可以关闭此警告。
我如何禁用这样的警告?
我收到了以下警告:
warning: 'X' is initialized and declared 'extern'
如果它旁边有一个-WSomeDefect
键,那么我可以使用-Wno-SomeDefect
命令行开关,但看起来没有明显的开关可以关闭此警告。
我如何禁用这样的警告?
extern
是带有初始化程序的约束违规,因为在正常用法中,extern
只提供声明而不是定义。然而,根据6.9.2 ¶1:
如果具有文件作用域和初始化程序的对象的标识符的声明,则该声明是标识符的外部定义。
由于语法似乎允许使用带有初始化程序的extern
,因此这确实是一个有效的定义。
GCC有一个-w
选项,可能会关闭警告,但代价是禁用所有警告,并且无法覆盖并重新启用其中一些警告。如果这是一个约束违规,并且需要修复无效代码,则这将是有意义的;但是,该代码是有效的,GCC绝对应该提供一种机制来避免产生关于它的虚假警告。
如Eljay在评论中指出:
警告分为几类:标准所需的诊断消息;常见意外语言滥用/误用的类似于lint的静态分析;出于良好意图但仍具有风格上的观点(例如
-Weffc ++
);可能过于迂腐和/或琐碎(例如-Weverything
或-pedantic
)。后者的类别应该有“退出”方式来禁用特定的警告,例如在OP的情况下。
GCC通常会尽力遵守这个“应该”,大多数时候,我认为没有办法禁用此警告值得报告给GCC bug tracker。
-Weffc ++
);可能过于迂腐和/或琐碎(例如,-Weverything
或-pedantic
)。后者应该有“选择退出”的方法来禁用特定的警告,就像在OP的情况下一样。 - Eljay-w
标记可以禁用所有警告信息,无法重新启用。但更好的选择是从变量声明/定义中删除
-w
阻止所有警告信息的输出。
extern
。这样编译器就知道变量在翻译单元内已经被定义。您可以联系代码的所有者以查看是否可以更改它。
-Werror
了。而你应该使用-Werror
。 - Konrad Rudolph-isystem
绝不能被用作禁用警告的hack。CMake默认使用它,这是一个巨大的bug - 它与默认包含路径排序的交互方式不同于-I
,会导致问题破裂。-isystem
的主要/唯一用途是与-nostdinc
一起使用,以使用不同的系统头文件集(例如您正在测试的未安装的libc版本),而不是基于其副作用的hack。 - R.. GitHub STOP HELPING ICE