C++如何转换sscanf相关参数类型以消除C4477编译警告
问题根因
%x 格式符要求传入的参数类型为 unsigned int *,而你传入的是 HMONITOR *,二者类型不匹配。更严重的是,32/64位系统下HMONITOR(句柄本质是指针类型)的长度可能和unsigned int不一致,直接硬转指针会触发截断、内存写越界等未定义行为,警告本身是在提示你存在这类风险。
合法解决方式
不要直接将HMONITOR*传入sscanf,通过中间接收变量做类型转换即可,有两种适配不同场景的方案:
方案1:兼容32/64位系统(推荐)
如果读入的十六进制值对应完整的句柄长度,用和指针长度一致的标准无符号整数做中间变量,适配不同位数系统:
// 需引入对应头文件 #include <cstdint> #include <inttypes.h> uintptr_t monHandleVal; // SCNxPTR是标准库定义的宏,匹配uintptr_t的十六进制读入格式 sscanf(reinterpret_cast<char *>(randomString), "%" SCNxPTR, &monHandleVal); // 转换为HMONITOR类型赋值 hMonLongExam = reinterpret_cast<HMONITOR>(monHandleVal);
方案2:确认读入值为32位无符号整数场景
如果你确定输入的十六进制值是32位unsigned int长度,可以直接用unsigned int做中间变量:
unsigned int tempVal; sscanf(reinterpret_cast<char *>(randomString), "%x", &tempVal); hMonLongExam = reinterpret_cast<HMONITOR>(tempVal);
两种方案都完全符合C++类型规范,不会触发编译警告,也避免了硬转指针带来的未定义行为。
内容的提问来源于stack exchange,提问作者Apuna12
相关产品推荐
相关产品推荐

