6

Windows SDK でコンパイルされる次のコードがあります。

UINT cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);

DragQueryFileW()この署名はどこにありますか:

UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT );

そして、UINT次のように SDK ヘッダーのどこかに定義されています。

typedef unsigned int UINT;

int確かに32ビットのプラットフォーム向け。いつものように、 のような型UINTは、システムのビット数に依存しない固定幅を持つことを意図しているため、同じコードを他のプラットフォームで再コンパイルする必要がある場合は、DragQueryFileW()何らかの形で再実装され、適切typedefUINT32-ビット符号なしタイプ。

現在、定数を見て、それは移植できないマジック番号であり、代わりに使用する必要0xFFFFFFFFがあると不平を言う静的分析ツールがあります。もちろん、移植性は良好ですが、移植する場合でも型は 32 ビットのままで、定数は問題ないため、ここで定数を使用することがどのように問題になるかわかりません。-1-10xFFFFFFFF

このシナリオでは、すべてのビットを安全かつポータブルに設定する0xFFFFFFFF代わりに使用していますか?-1

4

4 に答える 4

12

(型のサイズに関係なく) すべてのビットを埋める移植可能な方法は、実際には次のとおりです。

type variable = (type)-1;

次のように:

UINT foo = (UINT)-1;

または C99 型名を使用して移植性を高める:

uint32_t foo = (uint32_t)-1;

C 標準では、-1 を割り当てるとすべてのビットが設定されることが保証されています。

ここで、変数が符号なし32 ビットであることを保証できる場合は0xFFFFFFFF、もちろん使用しても問題ありません。しかし、私はまだ-1バリアントに行きます。

于 2011-06-28T06:13:30.947 に答える
4

あなたが使用することができます:

type var =  0;
var = ~var;
于 2011-06-28T06:43:40.370 に答える
3

0xFFFFFFFF で見られる潜在的な問題の 1 つは、簡単に 1 つの F を見逃して、完全なダミー値で初期化できることです。

定数を定義する方が良いと思います:

#define  ALL_ONES_32BIT ((UINT) -1)

そしてそれをどこでも使用します。

于 2011-06-28T06:15:08.717 に答える
2

0xffffffff は、すべてのビットを 32 ビットに 1 に設定する確実な方法です。しかし、私は UINT が常に 32 ビットであることに依存しません。

「魔法」を少なくするために、次のように書くこともできます: (1 << 32) - 1

于 2011-06-28T06:12:54.613 に答える