C++ 如何识别生成警告的标题?

C++ 如何识别生成警告的标题?,c++,visual-studio,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 de

我相信你们中的许多人都熟悉这组警告。这些大部分时间是由包含文件生成的。解决方案是
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...

标准包含文件应具有包含保护。因此,您可以在禁用该警告的情况下,将这些文件显式包含在自己文件的顶部:

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

// rest of your #includes
#pragma警告(推送)
#杂注警告(禁用:4995)
#包括
#包括
#包括
#布拉格警告(pop)
//你剩下的#包括
这样,您知道存在问题的标题将禁用警告。这需要位于代码的顶部,以便头第一次包含在禁用警告部分中。

在我的例子中,将
#include
移动到列表的底部可以在不使用额外编译器指令的情况下消除警告

找出调用
#pragma deprecated
的位置的一个好方法是进入“Preprocessor”下的编译器设置,并将生成预处理文件设置为类似行号(/p)的值。重建,然后打开*.i文件并搜索
已弃用的
。附近将是违规者的名字


我使用的是VS2003,因此对话框对您来说可能略有不同。

我想附和@Celdecea所说的

很明显,如果MS做了GCC所做的事情,并为文件指定了包含的路径(堆栈?),那将是很好的,我想这就是您正在寻找的;不幸的是,我找不到一个编译器指令来完成这项工作,所以对.I文件进行grepping是一个痛苦但有效的替换

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


如果没有,或者如果你想使用
pragma push/disable/pop
样式,那么@Greg似乎有最好的解决方案,可以先发制人地显式定义那些引起你痛苦的头。

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

#pragma warning(push)
#pragma warning(disable: 4995)
#include <set>
#pragma warning(pop)
#pragma警告(推送)
#杂注警告(禁用:4995)
#包括
#布拉格警告(pop)
执行上述操作解决了我的问题。

包括以下行:

要内联使用Strsafe函数,请在所有其他头文件的#include语句之后包含如图所示的头文件

在MSDN脱机帮助中,它说:

重要提示:strsafe.h的include行应位于所有其他标题的include行之后

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

Kevin在Visual Studio 2010(可能还有其他版本)中,将C++/advanced的“show includes”选项设置为Yes或添加/showIncludes命令行选项

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

此技术对于包含文件引起的大多数生成问题都很有用

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

要抑制警告,请按照上面Greg Hewgill的建议,将有问题的include文件添加到4995抑制块中。它可以位于源文件的顶部,也可以位于预编译的头文件中,或者位于整个项目中包含的“强制”包含文件(C++/Advanced/forced include file)中


4995 CRT弃用错误的特殊问题是,每次代码调用弃用函数时,似乎都会生成这些错误,即使在声明弃用函数时禁止了警告4995

在我的VS2008案例中,这些警告来自于
#include
(或其他一些
std
库)。似乎微软不能听从他们自己的建议

执行以下操作修复了该问题:

#pragma warning(push)
#pragma warning(disable: 4995)
#include <vector>
#pragma warning(pop)
#pragma警告(推送)
#杂注警告(禁用:4995)
#包括
#布拉格警告(pop)

只要确保在您的套餐中尽早完成即可。

我不太明白。头文件的名称在错误消息中…警告头(cstdio)未直接包含在我的头中。我想找出的“中间”标题很少。我建议只在项目中搜索有问题的函数。VS会对其进行索引,因此通常情况下,您应该相对快速地找到出现的情况。问题不是如何解决这个问题,而是找到一种简单的方法来识别导致警告的标题(例如示例中的cstdio/cstdio/cwchar)@cprogrammer:我只是使用了与您在问题中引用的错误消息中显示的名称相同的名称。@greg我感兴趣的是当
cstdio
cstring
cwchar
未直接包含在我的文件中时的情况。假设我包含一个名为“vector”的标题,其中包含
cstdio
cstring
cwchar
。我怎样才能识别向量头呢?@cprogrammer:我想说的是,在这种情况下,你不需要识别
vector
。如果导致问题的
vector
包含
cstdio
,则您需要做的就是如上所述包含
cstdio
,并禁用相关警告。然后,稍后在包含
vector
时,
cstdio
头将已经包含,并且将被其自己的包含保护跳过。因此,您不会再次收到该警告。@greg
vector
无法修改-由Ms编写,是sdk的一部分。Th