【问题标题】:VS2017 C++: Howto supress warnings after "Generating Code..."VS2017 C++:如何在“生成代码...”之后抑制警告
【发布时间】:2019-04-23 00:30:48
【问题描述】:

在 MSVC 输出窗口显示“正在生成代码...”后,我收到警告。

1>Note: including file: D:\FOO\INC\ippcc.h
1>Generating Code...
1>d:\FOO\inc\ipinctrlimpl.h(130): warning C4701: potentially uninitialized local variable 'hResult' used
1>d:\FOO\inc\iwatchdogimpl.h(158): warning C4702: unreachable code
1>   Creating library ..\..\LIB/FOO.lib and object ..\..\LIB/FOO.exp
1>FOO.vcxproj -> D:\FOO\FOO.dll
1>Done building project "FOO.vcxproj".

如何在不为整个解决方案禁用它们的情况下抑制这些警告?我自己无法触摸代码,因此无法修复它们。

根据this post,编译器此时正在生成机器代码。那么这些警告怎么可能产生呢?毕竟基本的编译已经完成了。

更新:

在项目设置中将全局警告级别设置为 /W3 而不是 /W4 可以防止这些警告(因为它们是 4 级警告)。

除了全局设置 /W3,我还可以在本地显式禁用关键包括的警告:

#pragma warning(push)
#pragma warning(disable : 4701 4702)
#include "CriticalInclude.h"
#pragma warning(pop)

但奇怪的事情来了:通过本地设置 /W3(甚至 /W1)

#pragma warning(push, 3)
#include "CriticalInclude.h"
#pragma warning(pop)

不会阻止这些警告。为什么?

似乎推送和弹出warning disable 的处理方式与推送新的警告级别不同。

【问题讨论】:

  • ipinctrlimpl.hiwatchdogimpl.h 是你自己的头文件吗?如果是这样,您应该解决问题而不是压制它。
  • 这些是我们公司内核代码的模板,我不碰。
  • 编译器在开始生成代码时发现这些问题是很正常的。解析器还不知道优化器要做什么。请记住,尽管它们出现在 .h 文件中,但它们可能很容易由您自己的代码生成。这些是内联函数,因此您传递的参数很重要。

标签: c++ visual-studio-2017 compiler-warnings suppress-warnings


【解决方案1】:

所以,在我之前的更新中,局部降低警告级别似乎并没有继续到“生成代码”阶段。

#pragma warning(push, 1)
#include "CriticalInclude.h"
#pragma warning(pop)

但是,在本地显式禁用这些警告确实会对生成代码阶段产生影响:

#pragma warning(push)
#pragma warning(disable : 4701 4702)
#include "CriticalInclude.h"
#pragma warning(pop)

在我看来,这几乎像是编译器中的一个错误。

【讨论】:

  • 仅供参考,我现在发现通过“警告推送”在本地降低警告级别根本无法按预期工作。在我的解决方案中,推/弹出栅栏外的警告被抑制,这是不应该发生的!!!也许预处理器中的错误?我不知道。为什么我知道,在 push/pop 中本地显式禁用某些警告会按预期工作。
【解决方案2】:

您不应该隐藏警告,而应该处理它们。
如果您有无法访问的代码,为什么还要在那里?
确保初始化变量。

根据这个答案在那个阶段没有完成基本编译:
VC++ 'Generating Code', what does it mean?

另外,如果这些不是您的文件,您应该向开发人员提出问题。但这是暂时的
How to suppress warnings in external headers in Visual C++

【讨论】:

  • 我知道编译指示警告(推送)。在包含标题之前,我经常使用它来抑制其他人的警告。我已经在包含这些关键标题的情况下使用了这个编译指示,但警告仍然存在。因此,Visual Studio 必须在某处做某事,这在某种程度上是我无法控制的。
  • 没有标题是什么意思。也许还有其他你没有看到的东西
  • 我在你已经回答的时候编辑了我上面的评论,对不起。我启用了“显示包含”,跟踪了关键包含的每个实例,并禁用了该包含分支的警告。我仍然收到警告。
  • msdn.microsoft.com/en-us/library/2c8f766e.aspx 确保您提供的级别正确,也许可以编辑您的帖子以显示您的使用情况
  • 根据那个 MSDN 页面,pragma 的最低支持值是 1 而不是 0,我在我的项目中使用过,请参阅我的主要帖子。但是,我在网上找到了许多资源,说明您可以将 0 用于完全禁用警告。
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
相关资源
最近更新 更多