如何禁用#pragma 警告?

Posted

技术标签:

【中文标题】如何禁用#pragma 警告?【英文标题】:How can I disable #pragma warnings? 【发布时间】:2008-09-25 11:14:19 【问题描述】:

在开发 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++ 编译器时禁用此类警告?

【问题讨论】:

【参考方案1】:

相信你可以用

编译
-Wno-unknown-pragmas

压制这些。

【讨论】:

谢谢!这应该被接受!它是唯一使用 GCC C++ 编译器的(此处)。 你能链接到它的文档吗?我可以only find(我的重点):“当一个 无法识别的警告 请求选项时(例如, -Wunknown-warning ),GCC 会发出一个诊断,指出该选项未被识别。”【参考方案2】:

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

在 MS Visual Studio 2005 中(此问题未使用 gcc 标记,因此我将其添加以供参考),您可以在 Project Settings->C/C++->Advanced 中全局禁用。在“禁用特定警告”中输入 4068

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

我的母语是英语,GCC 诊断编译指示页面完全无法理解。【参考方案4】:

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

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

GCC:-Wno-unknown-pragmas/#pragma GCC diagnostic ignored "-Wunknown-pragmas" Clang: -Wno-unknown-pragmas / #pragma clang diagnostic ignored "-Wunknown-pragmas" Intel C/C++ Compiler: -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++ Compiler: --diag_suppress Pe161 / #pragma diag_suppress=Pe161 Digital Mars C/C++ Compiler: -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 中也有相应的宏:HEDLEY_DIAGNOSTIC_PUSH / HEDLEY_DIAGNOSTIC_POP

【讨论】:

【参考方案5】:

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-unknown-pragmas

【讨论】:

如果您正在编译 C 代码而不是 C++,请使用 QMAKE_CFLAGS_WARN_ON += -Wno-unknown-pragmas

以上是关于如何禁用#pragma 警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 #pragma 和 gcc 选择性地禁用 -Werror

7.5 pragma 指令

#pragma 警告(push) 没有 #pragma 警告(pop)

msvc pragma 警告在 cpp 文件中省略“默认”

无法禁用特定编译器警告 (4100)

如何在Visual C ++中禁止外部标头中的警告