Microsoft C编译器(cl.exe):是否可以限制每个文件(/Wall)的警告范围?

Microsoft C编译器(cl.exe):是否可以限制每个文件(/Wall)的警告范围?,c,visual-c++,warnings,cl.exe,C,Visual C++,Warnings,Cl.exe,运行cl.exe时,可以指定警告级别 cl /W3 cl /W4 # warn even more cl /Wall # all warnings on 但是,最高级别的/Wall,似乎不切实际,因为它会在Windows头文件中触发警告,例如在windef.h(适用于VS2010的Windows SDK)中。最常见的两种情况似乎是和。因此,您可以关闭它们: cl /Wall /wd4668 /wd4820 仍然留给您: 所以你也加上: cl /Wall /wd4668

运行
cl.exe
时,可以指定警告级别

cl /W3
cl /W4        # warn even more
cl /Wall      # all warnings on
但是,最高级别的
/Wall
,似乎不切实际,因为它会在Windows头文件中触发警告,例如在
windef.h
(适用于VS2010的Windows SDK)中。最常见的两种情况似乎是和。因此,您可以关闭它们:

cl /Wall /wd4668 /wd4820
仍然留给您:

所以你也加上:

cl /Wall /wd4668 /wd4820 /wd4255
但也可能会出现其他问题。我可能希望为我自己的代码保留这些警告,只是不要让输出被并非源于我的代码的警告弄得乱七八糟

有没有办法让编译器将不同的设置应用于标准头而不是我自己的代码

更新


嗯,有一个,答案是用
/W4
而不是
/Wall
。MSVC可能无法为不同的文件指定不同的设置。

不幸的是,Visual Studio似乎没有为在特定搜索路径中找到的所有头文件指定警告级别的选项或类似选项来关闭警告。我自己坚持使用
/W4
,因为你描述的正是这个问题

我能想到的解决这个问题的唯一方法是在所有文件中使用以下内容,无论这些文件的标题是否有问题:

#pragma warning( push, 4 ) // Saves the current warning level and sets it to 4
#include <Windows.h>
#pragma warning( pop )     // Restores the old warning level

#include "MyHeader.h"      // Include other 'non-system' headers
#pragma warning(push,4)//保存当前警告级别并将其设置为4
#包括
#pragma warning(pop)//恢复旧的警告级别
#包括“MyHeader.h”//包括其他“非系统”标题

请注意,我实际上还没有尝试过这个,所以它可能根本不起作用

编译器对#include文件一无所知。这就是预处理器的危害#pragma warning是你的朋友。这类事情真的很烦人-MS真的应该修复它来做GCC所做的事情(允许某些include目录为“系统”include,不受警告影响),或者他们应该修改标题以完全不受警告影响,而不管警告级别如何(即使是通过使用pragmas来禁用在处理标头时生成的警告)。对于Microsoft以外的任何人来说,从系统标头(无论是编译器库的一部分还是SDK或DDK)获取警告都毫无意义。@Hans Passant,这是一个相关的观察结果。:-),GCC似乎能够保持沉默。将合适的
#pragma
s插入源代码或其执行的任何操作。不过,你是对的,编译器不知道
#include
文件。@Michael Burr:同意。我很高兴在VS2010中看到
/Wall
警告级别,但很快就决定不值得实际使用它,因为它有一百万条警告谢谢,这很有用!奇怪的是,我似乎不得不在
#pragma warning(push,3)
中将警告级别设置为3,以关闭我在运行
/Wall
时提到的恼人警告。但是当使用
/W4
运行时,这些警告不会被触发。@Lumi:这很奇怪;我最初在回答中输入了3,然后我想我知道4不会触发这些警告,所以这应该足够好了:-)不管怎样,我很高兴它起作用了。
#pragma warning( push, 4 ) // Saves the current warning level and sets it to 4
#include <Windows.h>
#pragma warning( pop )     // Restores the old warning level

#include "MyHeader.h"      // Include other 'non-system' headers