assert(true)警告签名/未签名不匹配

时间:2016-02-08 23:35:38

标签: c++ visual-studio-2008 assert suppress-warnings

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__ ??

的错误

1 个答案:

答案 0 :(得分:5)

The bug report explains it very well

  

出现此问题是因为__LINE__的类型为long,而断言   macro将__LINE__作为_wassert函数的参数传递给它   期望一个unsigned int。如果不使用/ZI进行编译,则__LINE__为   常量表达式,因此编译器可以静态地确定   转换为unsigned int将导致相同的值。什么时候   使用/ZI进行编译时,__LINE__不是常量表达式,因此   编译器无法静态确定转换结果   在相同的值,它发出警告C4365。

它还提供了一种解决方法:

  

作为此问题的解决方法,我建议使用#undefing assert   您的源代码,并使用相同的定义重新定义它   在<assert.h>,但有一个演员来压制警告。

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