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()某种方式重新实现的地方也会有一个对应typedefUINT映射到合适的 32-位无符号类型。

现在有一个静态分析工具,它查看0xFFFFFFFF常量并抱怨它是一个不可移植的幻数,应该-1改用. 虽然当然-1是好的和可移植的,但我看不出在0xFFFFFFFF这里使用常量可能是个问题,因为即使移植类型仍然是 32 位的,并且常量会很好。

在这种情况下,是否使用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 的一个潜在问题是您很容易错过一个 F 并初始化为一个完整的虚拟值。

我认为最好定义一个常数:

#define  ALL_ONES_32BIT ((UINT) -1)

并在任何地方使用它。

于 2011-06-28T06:15:08.717 回答
2

0xffffffff 肯定是将所有位设置为 32 位中的一个的可靠方法。但我不会依赖 UINT 总是 32 位。

为了让它不那么“神奇”,你也可以这样写: (1 << 32) - 1

于 2011-06-28T06:12:54.613 回答