如何禁用#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