50

在开发 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++ 编译器时是否可以禁用这种警告?

4

5 回答 5

103

我相信你可以编译

-Wno-unknown-pragmas

压制这些。

于 2008-09-25T11:30:07.517 回答
25

在 GCC 中,使用 -Wno-unknown-pragmas 编译

在 MS Visual Studio 2005 中(这个问题没有用 gcc 标记,所以我添加它以供参考),您可以在项目设置->C/C++->高级中全局禁用。在“禁用特定警告”中输入 4068

或者您可以将其添加到任何文件以在本地禁用警告

#pragma warning (disable : 4068 ) /* disable unknown pragma warnings */
于 2008-09-25T14:02:07.573 回答
18

也许看到GCC Diagnostic Pragmas?或者,在这种情况下,您可以使用启用的选项组合,不包括.-Wall-Wunknown-pragmas

于 2008-09-25T11:30:34.380 回答
15

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

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

  • 海合会:-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

您可以将其中的大部分组合到一个宏中以在您的代码中使用,这就是我在HedleyHEDLEY_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

于 2018-04-14T18:28:19.480 回答
8

就我而言,我在MinGW下使用Qt。我需要在我的.PRO文件中以另一种方式设置标志:

QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas
于 2012-07-27T11:11:00.970 回答