2

警告: '(stride * 4u)' の 'unsigned int' から 'WORD {aka short unsigned int}' への { } 内での縮小変換は、C++11 では不適切な形式です [-Wnarrowing]

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、これが縮小変換であることがわかりません。のデータ型を WORD、DWORD、CHAR、すべてにsizeof変更しようとしましたが、同じまたは同様の警告が引き続き表示されます。stride

4

2 に答える 2

4

の定義を見てくださいD3DVERTEXELEMENT9:

struct D3DVERTEXELEMENT9 {
  WORD Stream;
  WORD Offset;
  BYTE Type;
  BYTE Method;
  BYTE Usage;
  BYTE UsageIndex;
};

http://msdn.microsoft.com/en-us/library/windows/desktop/bb172630%28v=vs.85%29.aspxからですが、typedefのものを削除しました)。

したがって、あなたはで初期化NORMALELEMENT.Offsetしていstride * sizeof(gs_scalar)ます。

のタイプsizeof(gs_scalar)std::size_t明らかunsigned intにあなたのプラットフォーム上にあり、 のタイプはstrideis unsigned(つまりunsigned int) なので、 のタイプはstride * sizeof(gs_scalar)isunsigned intです。しかし、 is の型NORMALELEMENT.OffsetWORDwhich isunsigned shortです。

あなたのプラットフォームunsigned intでは幅は 32 ビットですが、幅unsigned shortは 16 ビットしかないので、これは確かに縮小変換です ( の値がstride * sizeof(gs_scalar)16 ビットに収まらない場合、データが失われます)。

と定義strideしても、との乗算でWORDは に昇格するので状況は変わらない。unsigned intsizeof(gs_scalar)

stride * sizeof(gs_scalar)絶対に超えないことが確実な場合USHRT_MAX(つまり、2 16 -1 つまり 65535)、それはありそうな (この例では 3 * 4 つまり 12) と思われる場合は、キャストを使用できます (トロイがコメント)、例えばstatic_cast<WORD>(stride * sizeof(gs_scalar)).

于 2013-08-31T09:44:15.113 に答える