这个代码用
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()以某种方式重新实现,还会有一个相应的typedef来生成UINT映射到合适的32位无符号类型.
现在有一个静态分析工具,它查看0xFFFFFFFF常量,并抱怨它是一个不可移植的幻数和one should use -1
instead.当然-1是好的和可移植的我不知道如何使用0xFFFFFFFF常量可能是一个问题,因为即使当移植类型仍然是32位,常量将是正常的.
在这种情况下,使用0xFFFFFFFF而不是-1来设置所有位安全且可移植吗?
解决方法
填充所有位(无论类型大小)的可移植方式实际上是:
type variable = (type)-1;
如:
UINT foo = (UINT)-1;
使用C99类型名称或更便携:
uint32_t foo = (uint32_t)-1;
C标准保证分配-1设置所有位.
现在,如果你可以保证你的变量是无符号的32位,那么使用0xFFFFFFFF也是正常的.但我仍然会选择-1变种.