如何禁用特定的未知 #pragma 警告(GCC 和/或 Clang)

新手上路,请多包涵

我知道如何禁用 所有 未知的#pragma 警告。例如,在 如何禁用#pragma 警告中给出了答案? .

有没有办法为一个特定的编译指示禁用“未知编译指示”警告?例如,如果我禁用 #pragma ugubugu 的警告,则以下代码:

 #pragma ugubugu
#pragma untiunti

int main() {return 0;}

编译时:

 g++ pragma.cpp -Wall
clang++ pragma.cpp -Wall

应该产生一个警告:

 warning: ignoring #pragma untiunti

例如,也许有一种简单的方法来注册一个什么都不做的自定义编译指示?

很高兴知道 Visual Studio 是否也有这样的选项,但这并不重要。


“但为什么他最终会玩自定义编译指示?”

我的源代码由两个编译器解析。在其中一个中,有一个特殊的 #pragma 这是另一个未知的。当然,我可以将 --- 放在 #ifdef COMPILER_IDENTIFICATION_MACRO ... #endif #pragma 每个实例周围,但这会很麻烦。

原文由 CygnusX1 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 947
1 个回答

我有理由确定没有任何方法可以做到这一点。

GCC 和 Clang 都有内部接口,允许语言前端向预处理器注册 #pragma 处理程序 - 请参阅 GCC 的 libcpp/directives.c 和 Clang 的 lib/Lex/Pragma.cpp 但是,正如我所看到的,没有什么可以让您根据命令行选项修改注册的处理程序(超出您正在编译的语言变体所暗示的内容)。

我知道如何禁用 所有 未知的#pragma 警告。例如,这里给出了答案: SO:如何禁用#pragma 警告?

请注意,投票最高的答案比那里接受的答案要好。 -Wno-unknown-pragmas 可以简单地添加到命令行 _之后_(如 -Wall ),这会打开警告。

我的源代码由两个编译器解析。在其中一个中,有一个特殊的 #pragma ,这是另一个未知的。当然,我可以将 --- 放在 #ifdef COMPILER_IDENTIFICATION_MACRO ... #endif #pragma 每个实例周围,但这会很麻烦。

从更哲学的角度来看,我认为这确实是正确的解决方案,尽管它可能很麻烦!

考虑到 --- #pragma #pragma 的全部意义在于提供一种机制用于在编译器中调用实现定义的行为。

(如果您最终这样做,请注意 Clang 定义了 __clang__ ,但 GCC 和 Clang 定义了 __GNUC__ 。)

原文由 Matthew Slattery 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题