2016-02-08 38 views
3

Visual Studio 2008,调试版本。的C++断言(真)警告签名/未签名不匹配

assert(true); 

此行导致投诉

warning C4365: 'argument' : conversion from 'long' to 'unsigned int', signed/unsigned mismatch 

与任何(有用)布尔表达式替换true时,即使有1ul警告仍然存在。

仅供参考,编译器的文件assert.h是:

#define assert(_Expression) (void)((!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0)) 
extern "C" _CRTIMP void __cdecl _wassert(_In_z_ const wchar_t * _Message, _In_z_ const wchar_t *_File, _In_ unsigned _Line); 

怎么能这样的警告可以干净抑制,但不影响所有 C4365的?是__LINE__的错?

回答

5

The bug report explains it very well:发生

此问题的原因是__LINE__类型的长,并且断言 宏传递__LINE__作为参数传递给_wassert功能,这 预计一个unsigned int。当不用/ZI编译时,__LINE__是一个 的常量表达式,所以编译器可以静态地确定转换为unsigned int的 将导致相同的值。当 与/ZI编译时,__LINE__不是一个常量表达式,因此 编译器无法静态确定转换结果将导致 具有相同的值,并且会发出警告C4365。

它也给出了一个解决办法:

对于这个问题的解决方法,我会建议#undefing在 坚持你的源代码,并重新#定义-ING它,使用相同的定义如 在<assert.h>中,但用一个强制转换来抑制警告。

请注意,此错误似乎已从MSVC2015开始修复。