4

コードに一連のオーバーロードされた関数を含める必要がありますが、変換警告が発生します。テストコードは次のとおりです。

#include windows.h

void f(DWORD arg){...}

//void f(SIZE_T arg){}

void main(void)
{
DWORD dword=0;
SIZE_T size_t=dword;
f(size_t);

}

コンパイラは警告を出します:

test.cpp(11) : warning C4244: 'argument' : conversion from 'SIZE_T' to 'DWORD', possible loss of data

void f(SIZE_T arg) のコメントを外すと、

test.cpp(5) : error C2084: function 'void f(DWORD)' already has a body

この警告またはエラーを回避するにはどうすればよいですか?

4

3 に答える 3

15

size_t符号なし整数型であることが保証されていますが、ビット数は指定されていません。a (32 ビット) に等しい場合DWORDもあれば、64 ビット プラットフォームで 64 ビットになる場合もあります。移植性を最大限に高めるために、特定のビット数があると想定しないでください。これは、コンパイラが警告していることです。値が 2^32 を超えないことがわかっている場合 (これは 99.99% のケースで妥当な想定です)、 a にキャストしDWORDて警告を取り除くことができます。

SIZE_T sz = dword;
f((DWORD)sz);  // no warning here

あなたが得ているエラーは、あなたの場合、size_t実際には 32 ビットであるため、2 つの関数の関数シグネチャfが同一であるためです。どちらも単一の符号なし 32 ビット パラメーターを取ります。プログラムが 32 ビット プラットフォームと 64 ビット プラットフォーム間で移植可能であることを保証するために、それらに別の名前を使用する必要があります。

void f_DWORD(DWORD arg) { ... }
void f_size_t(size_t arg) { ... }

最後の注意:size_tは組み込み型です。 SIZE_Tは非標準であり、ほぼ間違いなく の typedef または #define ですsize_tsize_tの代わりに を使用する必要がSIZE_Tあります。また、変数に名前を付けることも避ける必要がありますsize_t。これは、型名を変数名で隠して混乱を招くためです。

于 2008-11-14T16:49:32.343 に答える
0

最も簡単な答えはf(DWORD)、削除して再定義することf(size_t)です。もちろん、 sf()以外の値で動作する場合を除きますsize_t

于 2008-11-15T00:52:25.753 に答える
-2

SIZE_T は 64 ビット システムで 8 バイトを使用し、DWORD は 4 バイトを使用します。

Windows データ型から

typedef ULONG_PTR SIZE_T;

#if defined(_WIN64)
 typedef unsigned __int64 ULONG_PTR;
#else
 typedef unsigned long ULONG_PTR;
#endif
于 2016-05-05T12:02:10.150 に答える