【问题标题】:How to enable GCC compiler flags via preprocessor directives, rather than command line options?如何通过预处理器指令而不是命令行选项启用 GCC 编译器标志?
【发布时间】:2020-12-14 22:39:52
【问题描述】:

我想知道如何在代码中激活 GCC 编译器标志,而不是将它们包含在命令行的编译命令中。

考虑以下最小示例,它会产生警告-Wswitch-bool(我认为默认情况下但至少启用-Wall):

switch (true) {
default:
    break;
}

在通过命令行编译程序时,可以通过提供标志-Wno-switch-bool 来抑制此警告。

是否可以在代码中激活此标志?以下天真的尝试不起作用,因为Wno-switch-bool 不是合法标识符(破折号被解释为减号):

#define Wno-switch-bool

使用什么合适的命令/语法?

注意:这个问题不是专门关于警告的。 IE。我不是在问如何停用特定类别的警告,我知道最好通过#pragma GCC diagnostic ignore 等来完成。这是关于如何在代码中启用 GCC 编译器标志的一般问题。例如,另一个示例可能是我如何通过预处理器指令激活-Werror-fno-implicit-templates(无论这是否不明智)。

【问题讨论】:

  • 你已经看过这个页面了吗?:GCC 6.62.13 Diagnostic Pragmas
  • 如果您不是在询问插槽警告,而不是让您的主要示例是关于禁用警告,那将非常令人困惑。为什么要更改-fno-implicit-templates mid 代码?如果没有好的用例,gcc 不太可能实现对它的支持
  • 我对你的问题有点困惑(问题的开头和结尾的注释之间存在冲突)。您知道#pragma GCC diagnostic ignored,但您的意思是您知道它与#pragma GCC diagnostic push#pragma GCC diagnostic pop 结合使用吗?似乎后者正是您问题的前半部分所要求的。
  • 我认为许多影响代码生成的标志只能合理地应用于完整的翻译单元。如果他们更改 ABI,甚至可能需要将它们应用于整个模块/程序,尽管编译单独翻译单元的流行范式不能强制执行(结构打包同时是一个例子和一个反例;它可以应用于特定结构,但不适用于同一 TU 中的其他结构,但应跨 TU 一致地完成。)
  • 嗯,大多数构建环境允许您更改单个文件的编译器选项。

标签: c++ gcc preprocessor


【解决方案1】:

是否可以在代码中激活此标志?

是的,您可以使用 GCC's diagnostic pragmas 在特定的代码 sn-p 周围临时应用特定的编译指示,方法是记住并随后在源本地调整之前恢复诊断的状态。例如:

#pragma GCC diagnostic push
//          ^^^^^^^^^^^^^^^ remember the state of the diagnostics
#pragma GCC diagnostic ignored "-Wswitch-bool"
//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tweak diagnostics
switch (true) {
default:
    break;
}
#pragma GCC diagnostic pop
//          ^^^^^^^^^^^^^^^ restore the state of the diagnostics

【讨论】:

  • 不幸的是,尽管这是 OP 的示例,但问题的含义更广泛。
  • 这不起作用。要停用警告,必须编写#pragma GCC diagnostic ignored "-Wswitch-bool" 或使用标志-Wno-switch-bool 编译(注意它们因字符串no- 而不同)我的问题是我是否可以通过代码中的预处理器指令激活-Wno-switch-bool。 (请注意,这只是一个示例,对于这个特定示例,我知道pragma 解决方案将是最佳选择。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多