提问人:Adrian 提问时间:2/3/2023 最后编辑:Adrian 更新时间:2/4/2023 访问量:313
为什么 gcc 在使用 GCC 诊断忽略“-Wcomment”时不会忽略注释 #pragma 错误?
Why is gcc not ignoring comment as error when using #pragma GCC diagnostic ignored "-Wcomment"?
问:
我有一些评论,有一些宏观的例子。为了使它们更具可读性,我以 a 结束该行,以在下一行继续宏。如果开发人员复制代码而不期望尾随空格,我宁愿不要在后面放置空格来消除问题,并且我们的 git 提交标准不喜欢尾随空格。此外,我们的编码标准禁止使用多行注释 (),并且我们的文档使用三斜杠 () 而不是 ( 样式注释。我们的编译器已经设置,所以我想暂时禁用这个错误。示例代码如下:\
\
/* */
///
/** ... */)
-Wall -Werror
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcomment"
// boo \
// hoo
#pragma GCC diagnostic pop
不幸的是,编译器仍在抱怨这个错误。我们使用的是 7.5,但这在最新的 12.2 下仍然不起作用。
文档说:
#pragma GCC diagnostic kind option
修改诊断的处置。请注意,并非所有诊断都是可修改的;目前只能控制警告(通常由“-W...”控制),而不是所有警告。用于确定哪些诊断是可控的,以及哪个选项控制它们。
-fdiagnostics-show-option
它没有说的是如何确定哪些诊断是可控的,这很烦人。-fdiagnostics-show-option
我做错了什么?
答:
当一个线条结束时,线条拼接在一起发生在翻译的第二阶段。什么是评论的确定发生在第三阶段。此时,gcc 已获得发出该警告所需的所有信息。还等什么?\
这些线路在第 4 阶段进行处理,为时已晚,无法停止相关警告。也许警告可以延迟,但鉴于并非所有诊断都是可修改的,我不认为仅仅为了使其受到 .#pragma
#pragma
它没有说的是如何确定哪些诊断是可控的,这很烦人。
-fdiagnostics-show-option
我认为文档具有误导性。我不明白如何使用此选项来确定哪些诊断是可控的,除了反复试验。我认为它有助于确定“哪个选项控制它们”(某种程度上——此选项默认处于打开状态)。此选项控制控制发出的警告的命令行选项的显示。
例如,with(默认值):-fdiagnostics-show-option
warning: multi-line comment [-Wcomment]
With(否定默认值):-fno-diagnostics-show-option
warning: multi-line comment
因此,这对于确定特定警告的命令行选项很有用,而该选项又可用于尝试忽略警告。如果有效,那么警告是可以通过控制的(不完全是令人兴奋的推论)。#pramga
#pragma
评论
Wno-comment
,并将 “ignored” 更改为 “error” #pragma 以获取 GCC 诊断错误 “-Wcomment”
-- 编译将通过,即使此 #pragma
试图将情况转换为错误。编译器不会等待,看看是否会发生覆盖。-Wno-comment
评论
#pragma