【发布时间】: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-templatesmid 代码?如果没有好的用例,gcc 不太可能实现对它的支持 -
我对你的问题有点困惑(问题的开头和结尾的注释之间存在冲突)。您知道
#pragma GCC diagnostic ignored,但您的意思是您知道它与#pragma GCC diagnostic push和#pragma GCC diagnostic pop结合使用吗?似乎后者正是您问题的前半部分所要求的。 -
我认为许多影响代码生成的标志只能合理地应用于完整的翻译单元。如果他们更改 ABI,甚至可能需要将它们应用于整个模块/程序,尽管编译单独翻译单元的流行范式不能强制执行(结构打包同时是一个例子和一个反例;它可以应用于特定结构,但不适用于同一 TU 中的其他结构,但应跨 TU 一致地完成。)
-
嗯,大多数构建环境允许您更改单个文件的编译器选项。
标签: c++ gcc preprocessor