Cam*_*une 3 c++ assert suppress-warnings visual-studio-2008
Visual Studio 2008,调试版本.这行C++
assert(true);
Run Code Online (Sandbox Code Playgroud)
导致投诉
warning C4365: 'argument' : conversion from 'long' to 'unsigned int', signed/unsigned mismatch
Run Code Online (Sandbox Code Playgroud)
当替换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);
Run Code Online (Sandbox Code Playgroud)
如何在不压制所有 C4365的情况下彻底抑制这个警告?这是__LINE__?? 的错吗?
出现此问题的原因
__LINE__是long类型,并且断言宏__LINE__作为参数传递给_wassert函数,该函数需要unsigned int.当不编译时/ZI,__LINE__是一个常量表达式,因此编译器可以静态地确定转换为unsigned int将导致相同的值.使用时编译时/ZI,__LINE__不是常量表达式,因此编译器无法静态确定转换将导致相同的值,并发出警告C4365.
它还提供了一个解决方法:
作为此问题的解决方法,我建议在源代码中使用#undefing assert,并使用与in相同的定义重新定义它
<assert.h>,但使用强制转换来抑制警告.
请注意,此错误似乎已从MSVC2015开始修复.