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);
如何才能在不消除所有C 4365的情况下,清晰地抑制这一警告?是__LINE__
的错吗??
发布于 2016-02-08 23:44:50
The bug report explains it very well
发生此问题是因为
__LINE__
的类型为long,assert宏将__LINE__
作为参数传递给_wassert函数,后者需要一个无符号int。当不使用/ZI
编译时,__LINE__
是一个常量表达式,因此编译器可以静态地确定向无符号int的转换将导致相同的值。使用/ZI
编译时,__LINE__
不是一个常量表达式,因此编译器无法静态地确定转换是否会导致相同的值,并发出警告C4365。
它还提供了一个解决办法:
为了解决这个问题,我建议在源代码中使用与
<assert.h>
相同的定义,并重新定义它,但使用强制转换来抑制警告。
注意,这个bug似乎是从MSVC2015开始修复的。
https://stackoverflow.com/questions/35281367
复制相似问题