如何禁用#pragma 警告?

新手上路,请多包涵

在开发 C++ 应用程序时,我不得不使用第三方库,它会产生大量与正在使用的无害 #pragma 指令相关的警告。

 ../File.hpp:1: warning: ignoring #pragma ident
In file included from ../File2.hpp:47,
                 from ../File3.hpp:57,
                 from File4.h:49,

使用 GNU C++ 编译器时是否可以禁用这种警告?

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

阅读 2.1k
2 个回答

我相信你可以编译

-Wno-unknown-pragmas

压制这些。

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

我知道这个问题是关于 GCC 的,但是对于希望尽可能便携的人来说:

大多数可以发出此警告的编译器都有一种方法可以从命令行(异常:PGI)或代码(异常:DMC)禁用警告:

  • GCC: -Wno-unknown-pragmas / #pragma GCC diagnostic ignored "-Wunknown-pragmas"
  • 叮当声:--- -Wno-unknown-pragmas / #pragma clang diagnostic ignored "-Wunknown-pragmas"
  • 英特尔 C/C++ 编译器-diag-disable 161 / #pragma warning(disable:161)
  • PGI#pragma diag_suppress 1675
  • MSVC : -wd4068 / #pragma warning(disable:4068)
  • TI: --diag_suppress,-pds=163 / #pragma diag_suppress 163
  • IAR C/C++ 编译器--diag_suppress Pe161 / #pragma diag_suppress=Pe161
  • 数字火星 C/C++ 编译器-w17
  • 克雷: -h nomessage=1234

您可以将其中的大部分组合到一个宏中以在您的代码中使用,这就是我为 Hedley 中的 HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS 宏所做的

#if HEDLEY_HAS_WARNING("-Wunknown-pragmas")
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
#elif HEDLEY_INTEL_VERSION_CHECK(16,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
#elif HEDLEY_PGI_VERSION_CHECK(17,10,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
#elif HEDLEY_GNUC_VERSION_CHECK(4,3,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
#elif HEDLEY_MSVC_VERSION_CHECK(15,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
#elif HEDLEY_TI_VERSION_CHECK(8,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
#elif HEDLEY_IAR_VERSION_CHECK(8,0,0)
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
#else
#  define HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
#endif

请注意,Hedley 可能拥有比此答案更完整的信息,因为我可能会忘记更新此答案,因此如果您不想只使用 Hedley(它是一个公共域 C/C++ 标头,您可以轻松放入您的项目) 您可能希望使用 Hedley 作为指南,而不是上面的信息。

版本检查可能过于悲观,但有时很难获得关于专有编译器过时版本的好信息,我宁愿安全也不愿后悔。同样,赫德利的信息可能更好。

许多编译器还可以将警告推送/弹出到堆栈上,因此您可以推送,然后在包含您无法控制的代码之前禁用它们,然后弹出,以便 您的 代码仍然会触发有问题的警告(因此您可以清理它)。 Hedley 中也有相应的宏: HEDLEY_DIAGNOSTIC_PUSH / HEDLEY_DIAGNOSTIC_POP

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

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