警告:在C++11 -Wnarrowing中,将“( short *4u)”从“无符号int”转换为“单词{又名短无符号int}”的转换范围变窄是错误的。
我不明白为什么会收到这个警告,从MinGW编译以下代码:
unsigned stride = 3;
D3DVERTEXELEMENT9 NORMALELEMENT =
{ 0, stride * sizeof(gs_scalar), D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 };
if (useNormals) stride += 3;它在抱怨大括号内的stride * sizeof(gs_scalar) (gs_scalar is float),但我看不出这是如何缩小转换的,因为sizeof返回字节数。我试着将stride的数据类型更改为WORD、DWORD、CHAR等,但我一直收到相同或类似的警告。
发布于 2013-08-31 09:42:33
stride是unsigned,因此它的值可能太大,无法适应unsigned short。此外,sizeof还有std::size_t类型,它也比WORD大。
如果您将stride设置为const unsigned,那么编译器可以看到实际值12确实适合unsigned short,并且错误消失了。但是,如果它不是常量,则需要显式地保证计算适合,因为大括号内的初始化项不允许截断或溢出。(“缩小”指的是丢失数据,指的是在数字的一端砍掉数字。)
只需使用static_cast< WORD >( … )。
https://stackoverflow.com/questions/18546540
复制相似问题