如何避免C语言中64位值转32位指针时的PE1053警告?
兼容32/64位环境下的地址指针转换警告解决方法
问题描述
我希望代码同时支持32位与64位版本。我的架构有一块静态非易失性内存用于存储数据,因变量大小固定,故使用64位变量存储地址指针,这在两种位宽环境下均可行。
初始化阶段,我将地址存入64位变量(u64前缀代表无符号64位整数变量):
初始化代码
extern MEMORY tNonVolatileMemory; MY_TYPE tType; // 在32位版本中可为32位 tNonVolatileMemory.u64Address = &tType;
当重新使用该地址时,编译器触发警告:
Warning[Pe1053]: conversion from integer to smaller pointer
运行时代码
extern MEMORY tNonVolatileMemory; MY_TYPE* ptType; ptType = (MY_TYPE*)tNonVolatileMemory.u64Address;
是否有编程方法可规避此警告?我曾尝试先转换为void指针来消除警告,但未成功。
解决方法
方法1:使用标准整数类型适配指针转换
C标准提供的uintptr_t类型(定义在<stdint.h>头文件中)是宽度足以容纳当前平台指针值的无符号整数类型。用它替代自定义u64存储地址,可从根源避免位宽不匹配警告:
修改MEMORY结构体的u64Address为uintptr_t类型后,代码可写为:
// 初始化 tNonVolatileMemory.address = (uintptr_t)&tType; // 转换回指针 ptType = (MY_TYPE*)tNonVolatileMemory.address;
该方式符合标准,在32/64位平台均能正常工作,不会触发警告。
方法2:多步显式转换(保留u64场景)
若因架构约束必须使用64位变量存储地址,可通过先转uintptr_t再转指针的方式消除警告:
ptType = (MY_TYPE*)(uintptr_t)tNonVolatileMemory.u64Address;
思路是先将64位整数转换为适配当前平台指针宽度的uintptr_t,再转为目标指针类型。编译器会识别该转换的安全性(前提是存储的地址在当前平台有效范围内),不再抛出警告。
方法3:编译器特定警告抑制
若前两种方法无法使用,可针对特定代码行添加编译器警告抑制指令。以抛出Pe1053警告的IAR编译器为例:
#pragma diag_suppress=Pe1053 ptType = (MY_TYPE*)tNonVolatileMemory.u64Address; #pragma diag_default=Pe1053
此方式为编译器专属方案,会降低代码可移植性,优先推荐前两种标准方法。
内容的提问来源于stack exchange,提问作者Cris
相关产品推荐
相关产品推荐

