如何识别生成警告的标头?

时间:2011-05-05 09:05:28

标签: c++ visual-studio

我相信很多人都熟悉这套警告。这些是包含文件生成的大部分时间。解决方案是pragma push/disable/pop,但识别标题不是一个好任务。

除了反复试验之外,有没有人知道识别标题的方法?

1>File1.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstdio(49) : warning C4995: 'gets': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstdio(53) : warning C4995: 'sprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstdio(56) : warning C4995: 'vsprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstring(22) : warning C4995: 'strcat': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstring(23) : warning C4995: 'strcpy': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cwchar(36) : warning C4995: 'swprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cwchar(37) : warning C4995: 'vswprintf': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cwchar(39) : warning C4995: 'wcscat': name was marked as #pragma deprecated
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cwchar(41) : warning C4995: 'wcscpy': name was marked as #pragma deprecated
1>Linking...

7 个答案:

答案 0 :(得分:14)

就我而言,将#include <strsafe.h>移动到列表底部就可以在不使用额外的编译器指令的情况下消除警告。

找出调用#pragma deprecated的位置的一个好方法是进入“预处理器”下的编译器设置,并将生成预处理文件设置为 With Line数字(/ P)。重建,然后打开* .i文件并搜索deprecated。附近将是违规的名称。

我正在使用VS2003,因此对话框可能会略有不同。

答案 1 :(得分:4)

标准包含文件应包含警戒。因此,您可以明确地将这些文件包含在您自己文件的 top 中,并禁用该警告:

#pragma warning(push)
#pragma warning(disable: 4995)
#include <cstdio>
#include <cstring>
#include <cwchar>
#pragma warning(pop)

// rest of your #includes

这样,对于您知道存在问题的标题,将禁用警告。这需要位于代码的顶部,以便首次在警告禁用部分中包含标题。

答案 2 :(得分:2)

我想知道@Celdecea说的话。

显然,如果MS做了GCC所做的事情并为文件指定了包含的路径(堆栈?),那将是很好的,我认为这是你正在寻找的;不幸的是,我无法找到编译器指令来执行此操作,因此通过.i文件进行grepping是一个痛苦但有效的替代。

我也发现我的问题源于#includes之后添加<strsafe.h>。由于我的错误列表(几乎?)与你的相同,如果这也解决了你的问题,我也不会感到惊讶。

如果没有,或者如果你想使用pragma push/disable/pop样式,那么似乎@Greg有先发制人的最佳解决方案,并明确定义那些导致你痛苦的标题。

答案 3 :(得分:0)

要添加到Greg Hewgill的帖子中,我发现了问题,我没有怀疑这个文件。

#pragma warning(push)
#pragma warning(disable: 4995)
#include <set>
#pragma warning(pop)

做到这一点解决了我的问题。

答案 4 :(得分:0)

notes for #include strsafe.h包括以下行:

  

要内联使用Strsafe函数,请在此处显示的头文件中包含所有其他头文件的#include语句。

在MSDN离线帮助中,它说:

  

重要说明:strsafe.h的include行应该跟随所有其他标题'include lines。

确保您只包含在cpp文件中,并且在所有其他c ++库头文件之后,警告消失了。

凯文

答案 5 :(得分:0)

在Visual Studio 2010中(可能还有其他版本)设置C ++ / advanced&#39; show includes&#39;选项为是或添加/ showIncludes命令行选项。

然后一次编译一个文件并在构建输出窗口中搜索您正在查找的警告编号,它将显示生成该警告的包含文件树。

此技术对包含文件导致的大多数构建问题很有用。

编辑:确保在问题得到解决时关闭/ showIncludes,因为它可能会干扰其他编译器选项(例如/ MP(使用多个进程构建)被禁用)。

要抑制警告,请按照上面Greg Hewgill的建议将违规包含文件添加到4995抑制块。这可以位于源文件的顶部,也可以位于预编译的标题中,也可以位于“强制”标题中。整个项目中包含的包含文件(C ++ / Advanced / Forced Include File)。

4995 CRT弃用错误的特殊问题是,即使在声明已弃用的函数时抑制了警告4995,它们似乎也会在每次代码调用已弃用的函数时生成。

答案 6 :(得分:0)

在我的VS2008案例中,这些警告来自#include <vector>(或其他std库。)似乎微软无法遵循自己的建议。

执行以下操作解决了问题:

#pragma warning(push)
#pragma warning(disable: 4995)
#include <vector>
#pragma warning(pop)

请确保您在包含中尽早完成。