【问题标题】:Put multiple pragma directives into one preprocessor define [duplicate]将多个 pragma 指令放入一个预处理器定义 [重复]
【发布时间】:2018-05-30 15:53:59
【问题描述】:

我需要在我的代码中推送/弹出几个 gcc 诊断。如果在单个文件中需要这样做,我会执行以下操作:

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wformat"
#pragma GCC diagnostic error "-Wuninitialized"

...some code...

#pragma GCC diagnostic push

但我在多个位置都需要这个。所以我想要一个#define 或类似的东西。我考虑过以下问题,但 c 预处理器不允许在 #define 中使用 #pragmas。

#define PushWarnings \
    #pragma GCC diagnostic push \
    #pragma GCC diagnostic error "-Wformat" \
    #pragma GCC diagnostic error "-Wuninitialized"

有没有办法做到这一点?

【问题讨论】:

  • @EdHeal “修复”是什么意思?
  • 代码是启用警告(或者更确切地说,将它们变成错误),而不是禁用它们。
  • @melpomene - 编译代码,这样所有警告都是错误的,不需要使用没有保护的代码位
  • 你为什么不直接修复代码,让这些警告不会触发?
  • @EdHeal 有时是你无法触及的外部代码。

标签: c++ c c-preprocessor pragma


【解决方案1】:

是的,有办法做到这一点。 C99 引入了 _Pragma 运算符(自 C++11 起也可用于 C++)。

编译指示如

#pragma GCC diagnostic error "-Wformat"

也可以写成

_Pragma("GCC diagnostic error \"-Wformat\"")

后者不是#预处理指令,所以可以从宏中生成:

#define PushWarnings \
    _Pragma("GCC diagnostic push") \
    _Pragma("GCC diagnostic error \"-Wformat\"") \
    _Pragma("GCC diagnostic error \"-Wuninitialized\"")

【讨论】:

  • 太棒了。很高兴了解_Pragma。
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多