为什么 gcc 在使用 GCC 诊断忽略“-Wcomment”时不会忽略注释 #pragma 错误?

Why is gcc not ignoring comment as error when using #pragma GCC diagnostic ignored "-Wcomment"?

提问人:Adrian 提问时间:2/3/2023 最后编辑:Adrian 更新时间:2/4/2023 访问量:313

问:

我有一些评论,有一些宏观的例子。为了使它们更具可读性,我以 a 结束该行,以在下一行继续宏。如果开发人员复制代码而不期望尾随空格,我宁愿不要在后面放置空格来消除问题,并且我们的 git 提交标准不喜欢尾随空格。此外,我们的编码标准禁止使用多行注释 (),并且我们的文档使用三斜杠 () 而不是 ( 样式注释。我们的编译器已经设置,所以我想暂时禁用这个错误。示例代码如下:\\/* */////** ... */)-Wall -Werror

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcomment"
// boo \
// hoo
#pragma GCC diagnostic pop

Demo

不幸的是,编译器仍在抱怨这个错误。我们使用的是 7.5,但这在最新的 12.2 下仍然不起作用。

文档说:

#pragma GCC diagnostic kind option

修改诊断的处置。请注意,并非所有诊断都是可修改的;目前只能控制警告(通常由“-W...”控制),而不是所有警告。用于确定哪些诊断是可控的,以及哪个选项控制它们。-fdiagnostics-show-option

它没有说的是如何确定哪些诊断是可控的,这很烦人。-fdiagnostics-show-option

我做错了什么?

C G++ 编译指示

评论

2赞 273K 2/3/2023
这是预处理器警告,不受 #pragma 控制。
0赞 Passer By 2/3/2023
@273K 听起来像是对我的回答。我被困住了,困惑了 10 分钟。
0赞 Adrian 2/3/2023
@273K,为什么不呢? 是一个预处理器命令,因此它位于 rigth 上下文中。你有什么参考资料支持吗?#pragma
0赞 Adrian 2/3/2023
你为什么@PasserBy被困住和困惑?
0赞 273K 2/3/2023
某些指令可能会在预处理器的输出中重复。它们是“#ident”(始终)、“#pragma”(仅当预处理器本身不处理编译指示时)

答:

2赞 JaMiT 2/3/2023 #1

当一个线条结束时,线条拼接在一起发生在翻译的第二阶段。什么是评论的确定发生在第三阶段。此时,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

评论

0赞 Adrian 2/3/2023
令人讨厌的无用(gcc,不是你的答案)。☹
0赞 Adrian 2/3/2023
“在这一点上,gcc拥有发出警告所需的所有信息。为什么还要等?因为它没有?:D某些人希望禁用此警告。:P
0赞 JaMiT 2/3/2023
@Adrian “因为它没有?”——我想你的意思是它没有抑制该警告所需的所有信息。我写了“发出那个警告”。微妙不同的标准。;)
0赞 Adrian 2/4/2023
或者不发出警告。;)
0赞 JaMiT 2/4/2023
@Adrian “或者不发出警告”——实际上,编译器确实有关于不发出警告的信息。如果通过命令行 () 将其关闭,编译器将不会发出警告。它仍然只是覆盖缺少的命令行。(您可以反向运行实验。在命令行上指定 -Wno-comment,并将 “ignored” 更改为 “error” #pragma 以获取 GCC 诊断错误 “-Wcomment” -- 编译将通过,即使此 #pragma 试图将情况转换为错误。编译器不会等待,看看是否会发生覆盖。-Wno-comment