提问人:Cris 提问时间:6/1/2023 最后编辑:sepp2kCris 更新时间:6/1/2023 访问量:53
在 C 语言中将 64 位值转换为 32 位指针时如何避免警告 PE1053?
How to avoid warning PE1053 when casting a 64-bit value to a 32-bit pointer in C?
问:
我想支持我的代码的 32 位和 64 位版本。 我的架构有一个静态非易失性存储器,我可以在其中存储数据。但是变量大小是静态的,所以我更改了它。因此,我使用一个 64 位变量来存储地址指针。这适用于 32 位和 64 位。
我在初始化阶段存储一个 64 位变量的地址(u64 前缀表示无符号 int 64 位变量)。
初始化
extern MEMORY tNonVolatileMemory;
MY_TYPE tType;
// Can be 32 bit in 32 Bit version
tNonVolatileMemory.u64Address = &tType;
当我想重用该地址时,会出现编译器错误:
警告[Pe1053]:从整数到较小指针的转换
运行
extern MEMORY tNonVolatileMemory;
MY_TYPE* ptType;
ptType = (MY_TYPE*)tNonVolatileMemory.u64Address;
是否有任何编程方法可以避免此警告?
我试图将拳头投向一个空指针以避免编译器警告
答:
3赞
chux - Reinstate Monica
6/1/2023
#1
在 C 语言中将 64 位值转换为 32 位指针时如何避免警告 PE1053?
“我使用 64 位变量来存储地址指针”
使用指针变量来存储指针,而不是强制转换。
extern void *tNonVolatileMemory;
tNonVolatileMemory = &tType;
如果希望该变量在 32 位地址计算机和 64 位地址计算机上始终占用相同的空间,请使用 .union
_Static_assert(sizeof (void *) <= sizeof(uint64_t), "Pointer too large");
union {
void *ptr;
uint64_t u64;
} tNonVolatileMemory;
tNonVolatileMemory.ptr = &tType;
评论
u64Address
uintptr_t
u64Address
uintptr_t
ptType = (MY_TYPE *) (uintptr_t) tNonVolatileMemory.u64Address;
stdint.h
是可移植代码的关键。你所有的整数都应该是该库中固定宽度的整数。要解决指针问题,应在以整数格式存储指针地址时使用。这是一种便携式类型,保证足够大,可以容纳给定系统上的指针。至于如何修复你的代码,你必须发布结构/类型定义。uintptr_t