sha*_*oth 6 c++ binary portability types bit-fields
这个代码用Windows SDK编译:
UINT cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
Run Code Online (Sandbox Code Playgroud)
DragQueryFileW()这个签名在哪里:
UINT DragQueryFileW(HDROP, UINT, LPWSTR, UINT );
Run Code Online (Sandbox Code Playgroud)
并UINT在SDK标题中的某处定义,如下所示:
typedef unsigned int UINT;
Run Code Online (Sandbox Code Playgroud)
对于平台int肯定是32位.像往常一样,类型UINT的意思是固定宽度独立于系统位度,所以如果必须在其他平台上重新编译相同的代码,那么在DragQueryFileW()某处重新实现的地方也会有相应的地图typedef,这将使UINT地图成为合适的32-位无符号类型.
现在有一个静态分析工具,着眼于0xFFFFFFFF不断并抱怨,这是一个不可移植的幻数和应使用-1来代替.虽然当然-1是好的和便携式的,但我不知道如何使用0xFFFFFFFF常量可能是一个问题,因为即使移植类型仍然是32位并且常量将是好的.
在这种情况下,是否使用0xFFFFFFFF而不是-1设置所有位安全和可移植?
Dar*_*ust 12
填充所有位(无论类型大小)的可移植方式实际上是:
type variable = (type)-1;
Run Code Online (Sandbox Code Playgroud)
如:
UINT foo = (UINT)-1;
Run Code Online (Sandbox Code Playgroud)
使用C99类型名称或更便携:
uint32_t foo = (uint32_t)-1;
Run Code Online (Sandbox Code Playgroud)
C标准保证分配-1设置所有位.
现在,如果你可以保证你的变量是无符号的 32位,那么0xFFFFFFFF当然使用也没问题.但我仍然会选择-1变体.
0xffffffff 无疑是将所有位设置为 32 位中的一位的可靠方法。但我不会依赖 UINT 总是 32 位。
为了让它不那么“神奇”,你也可以写它: (1 << 32) - 1