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

Posted

技术标签:

【中文标题】msvc pragma 警告在 cpp 文件中省略“默认”【英文标题】:msvc pragma warning omitting 'default' in cpp file 【发布时间】:2020-01-07 21:27:48 【问题描述】:

我在 cpp 文件(不是标题)中有一些 pragma warning (disable : xxx)

现在,如果我们在同一个 cpp 文件中省略 pragma warning (default : xxx),该警告是在项目中的所有 cpp 文件中还是仅在此 cpp 文件中保持禁用状态?

如果我们编译多个项目,禁用的警告是否会影响所有项目?假设 cpp 文件中的 pragma 仅不在标头中。

例如,我有:

#ifdef NDEBUG   // In release build using CrtDebug functions has no effect!
#define CRT_DBG_REPORT(...) 0
#pragma warning (disable : 6326)    // Potential comparison of a constant with another constant
#pragma warning (disable : 26814)   // The const variable can be computed at compile time
#pragma warning (disable : 26477)   // Use nullptr rather than 0 or NULL
#pragma warning (disable : 4127)    // conditional expression is constant
#pragma warning (disable : 4100)    // unreferenced formal parameter
#else
#define CRT_DBG_REPORT _CrtDbgReportW
#endif // NDEBUG

我想省略设置回“默认”,但确保它只禁用此 cpp 文件的警告。

编辑

感谢评论区的建议...

如果我们启用Unity 构建,“undefauled”(仅禁用)cpp pragma 的行为是什么? Project properties -> Advanced -> Unity.

【问题讨论】:

我希望只有 .cpp 文件,因为每个翻译单元都是单独编译的。 @downvoter 肯定有一些文件来支持他的反对票? @drescherjm,值得注意的是,在 VS 中您可以启用Unity build,它将多个“cpp”文件合并为一个以加快编译速度。在这种情况下,pragams 可能无法按照您的建议工作。但除此之外是的,我假设相同。 Project properties -> Advanced -> Unity 谢谢,直到现在我还没有听说过这个功能.. 【参考方案1】:

如果警告在 cpp 文件中被禁用,它们只会影响 pragma 下的行(它们不会影响其他编译单元)。 Unity 构建可能会导致问题,但 (猜测,现在无法测试)

一般来说,如果您通过编译指示启用/禁用警告,这可能是要走的路:

#define PUSH_DISABLE_WARNINGS \
  __pragma(warning(push)) \
  __pragma(warning(disable : 6326)) \
  __pragma(warning(disable : 26814)) \
  __pragma(warning(disable : 26477)) \
  __pragma(warning(disable : 4127)) \
  __pragma(warning(disable : 4100))

#define POP_DISABLE_WARNINGS \
  __pragma(warning(pop))

然后以后...

PUSH_DISABLE_WARNINGS

/* warnings will only be disabled here */

POP_DISABLE_WARNINGS

【讨论】:

不错的解决方案!我确实使用#define SUPPRESS(...) __pragma(warning(disable : __VA_ARGS__)) 来禁用单行,但从来没有想到将它与push/pop 结合起来并影响入口文件。非常好!

以上是关于msvc pragma 警告在 cpp 文件中省略“默认”的主要内容,如果未能解决你的问题,请参考以下文章

msvc/gcc:中用#pragma指令关闭特定警告(warning)

#pragma 警告 - 特定于文件?

防止临时对象文件在 MSVC 中撞击磁盘

编译器处理警告错误 #pragma GCC diagnostic ignored "-Wunused"

MSVC 2015 /Wall 有很多无用的消息

MSVC:为啥“#pragma fenv_access (on)”会导致“错误 C2099:初始化程序不是常量”?