Microsoft C 编译器 (cl.exe):可以限制每个文件 (/Wall) 的警告范围吗?
Posted
技术标签:
【中文标题】Microsoft C 编译器 (cl.exe):可以限制每个文件 (/Wall) 的警告范围吗?【英文标题】:Microsoft C compiler (cl.exe): possible to limit scope of warnings per files (/Wall)? 【发布时间】:2011-07-19 22:39:09 【问题描述】:运行cl.exe
时,可以指定警告级别。
cl /W3
cl /W4 # warn even more
cl /Wall # all warnings on
但是,***别 /Wall
似乎不切实际,因为它会在 Windows 头文件中触发警告,例如在 windef.h
(适用于 VS2010 的 Windows SDK)中。最常出现的两个似乎是C4668 和C4820。所以你可以关闭它们:
cl /Wall /wd4668 /wd4820
仍然留下C4255:
C:\SDKs\Windows\v7.0A\include\windef.h(230) : warning C4255: 'FARPROC'
C:\SDKs\Windows\v7.0A\include\windef.h(231) : warning C4255: 'NEARPROC'
C:\SDKs\Windows\v7.0A\include\windef.h(232) : warning C4255: 'PROC'
所以你也添加了:
cl /Wall /wd4668 /wd4820 /wd4255
但其他人可能会突然出现。而且我可能想为我自己的代码保留这些警告,只是不要让输出被并非源自我的代码的警告弄得一团糟。
有没有办法让编译器将不同的设置应用于标准头文件而不是我自己的代码?
更新
嗯,有一个similar question,答案是使用/W4
而不是/Wall
。也许 MSVC 无法为不同的文件指定不同的设置。
【问题讨论】:
编译器对#include 文件一无所知。这就是预处理器的危害。 #pragma 警告是你的朋友。 这种事情真的很烦人 - MS 真的应该解决这个问题来做 GCC 所做的事情(允许某些包含目录是不受警告的“系统”包含)或者他们应该修改标题以无论警告级别如何,都完全没有警告(即使这是通过使用编译指示禁用在处理标头时生成的警告)。微软以外的任何人都没有必要从系统头文件中获得警告,无论是编译器库的一部分还是 SDK 或 DDK。 @Hans Passant,这是一个中肯的观察。 :-) 尽管如此,GCC 似乎还是能够保持沉默。将合适的#pragma
s 插入源或任何它的作用。不过,你是对的,编译器不知道#include
文件。
@Michael Burr:阿门。我很高兴在 VS2010 中看到 /Wall
警告级别,但很快就决定不值得实际使用它,因为有数百万条警告
【参考方案1】:
不幸的是,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
请注意,我实际上并没有尝试过,所以它可能根本不起作用!
【讨论】:
谢谢,这很有用! MSDN link here. 奇怪的是,我似乎必须在#pragma warning( push, 3 )
中将警告级别设置为 3,以便关闭我在使用 /Wall
运行时提到的恼人警告。但是当使用/W4
运行时,不会触发这些警告。
@Lumi:这很奇怪;我最初在答案中输入了 3,然后发现我知道 4 不会触发这些警告,所以这应该足够好了 :-) 无论如何,我很高兴它起作用了。以上是关于Microsoft C 编译器 (cl.exe):可以限制每个文件 (/Wall) 的警告范围吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何只用visual c++编译器而不安装visual studio
error: command ‘C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe‘