为什么我没有在Visual Studio 2012中获得64位警告,除非我打开“不推荐使用”的编译器开关?

我最近在我们的代码中遇到了一个64位兼容性错误,其中一个64位指针被存储在一个32位数字中,并且已经结束被使用,导致访问冲突。 该错误已经在我们的代码2年了! 直到最近,当我们改变到VC2012 C运行时,我们从来没有崩溃,当它开始崩溃的时候。 我很好奇,为什么我们从来没有见过这样的编译器警告。 我创build了以下程序并在VC2012编译器上打开/W4 。 我build立在64位模式。

 int _tmain(int argc, _TCHAR* argv[]) { void* b = new int; ULONG ulB = (ULONG)b; return 0; } 

这个程序编译没有警告,但是,当我打开/ Wp64我看到这个警告:

 1>cl : Command line warning D9035: option 'Wp64' has been deprecated and will be removed in a future release 1>ConsoleApplication5.cpp(10): warning C4311: 'type cast' : pointer truncation from 'void *' to 'ULONG' 

..这是我所期待的那种东西。

当我看到文档时,我发现/Wp64的确已被弃用。 但是,现在应该将其构build到标准/W4警告集中,并且页面显示“不使用此选项和关键字来检测64位可移植性问题,而是使用一个面向64位平台的Visual C ++编译器并指定/W4选项“

http://msdn.microsoft.com/en-us/library/yt4xw8fh(v=vs.110).aspx

那么给了什么? /W4不会像旧的弃用/Wp64一样产生64位警告…

所以答案似乎并不是所有的64位警告在/W4都可用。 但是,如果你想捕捉这个特定类型的bug,你应该使用/w14302来构建,这会将警告4302切换到1级。因此,它将被打印出来,而不必打开所有的警告。