如何禁用#pragma警告?

时间:2008-09-25 11:14:20

标签: c++ compiler-construction warnings 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 ++编译器时是否可以禁用此类警告?

5 个答案:

答案 0 :(得分:97)

我相信你可以用

编译
-Wno-unknown-pragmas

压制这些。

答案 1 :(得分:24)

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

进行编译

在MS Visual Studio 2005中(此问题未标记为gcc,因此我将其添加为参考),您可以在项目设置 - > C / C ++ - >高级中全局禁用。在“禁用特定警告”

中输入4068

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

#pragma warning (disable : 4068 ) /* disable unknown pragma warnings */

答案 2 :(得分:18)

也许看GCC Diagnostic Pragmas?或者,在这种情况下,您可以使用-Wall启用的combination of options,不包括-Wunknown-pragmas

答案 3 :(得分:7)

谢谢大家的提示。就我而言,我和Qt Mingw一起工作。我需要在我的.PRO文件中另外设置标志:

QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas

答案 4 :(得分:5)

我知道这个问题是关于海湾合作委员会,但对于那些希望尽可能轻松地做到这一点的人来说:

大多数可以发出此警告的编译器都可以通过命令行(例外:PGI)或代码(例外:DMC)禁用警告:

  • 海湾合作委员会:-Wno-unknown-pragmas / #pragma GCC diagnostic ignored "-Wunknown-pragmas"
  • clang:-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
  • Digital Mars C / C ++编译器:-w17

您可以将大部分内容合并到一个宏中,以便在代码中使用,这就是我为HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS中的Hedley宏所做的事情:

#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也有这样的宏:HEDLEY_DIAGNOSTIC_PUSH / HEDLEY_DIAGNOSTIC_POP