首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >断言(True)警告签名/无符号不匹配

断言(True)警告签名/无符号不匹配
EN

Stack Overflow用户
提问于 2016-02-08 23:35:38
回答 1查看 250关注 0票数 4

2008,调试生成。这一行C++

代码语言:javascript
运行
复制
assert(true);

引起投诉

代码语言:javascript
运行
复制
warning C4365: 'argument' : conversion from 'long' to 'unsigned int', signed/unsigned mismatch

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

编译器的文件assert.h是:

代码语言:javascript
运行
复制
#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__的错吗??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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开始修复的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35281367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档