C 从uint8\u t指针强制转换到uint32\u t整数编译错误
编译过程中显示以下错误:C 从uint8\u t指针强制转换到uint32\u t整数编译错误,c,pointers,casting,C,Pointers,Casting,编译过程中显示以下错误: aes.c:267:35: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast] HWREG(AES_DMAC_CH0_EXTADDR) = (uint32_t)pui8MsgIn; 第275-276行: // base address of the input data in ext. memory HWREG(AES_DMAC_CH0_EXTA
aes.c:267:35: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast]
HWREG(AES_DMAC_CH0_EXTADDR) = (uint32_t)pui8MsgIn;
第275-276行:
// base address of the input data in ext. memory
HWREG(AES_DMAC_CH0_EXTADDR) = (uint32_t)pui8MsgIn;
pui8MsgIn是uint8\u t*的类型
HWREG宏如下所示:
#define HWREG(x) \
(*((volatile uint32_t *)(x)))
我对C及其指针没有经验,但我可以通过将uint32\u t转换为uintpttr\u t来解决它。对吗
我想确认这一点,因为uintpr\u t的名称中似乎没有任何与uint32\u t相反的大小
大概我可以通过将uint32\u t
cast更改为uintpttr\u t
来解决这个问题。
对吗
对uintpttr_t
被指定为一个无符号整数类型,其宽度足以容纳任何指针转换为整数的结果
我想确认一下,因为uintptru\t似乎没有任何尺寸
以与uint32\t相反的名义
这就是重点(没有双关语)。C没有指定指针有多大,事实上,这在不同的实现中有所不同。如果必须容纳所有实现的指针,则不能在类型名称中指定特定的大小。是。uintptr\t而不是uint32\u t应该修复它。我猜硬件是32位的。我相信这就是问题所在:
HWREG(AES_DMAC_CH0_EXTADDR)=(uint32_t)pui8MsgIn代码>我想你需要右手边是(uint32_t*)(void*)pui8MsgIn代码>以避免在现代编译器(如GCC和Clang)下出现错误和后续警告。Clang通常需要额外的中间转换以避免额外的警告。详细信息:“C不指定指针有多大”包括指针可能比所有整数类型都宽。类型(u)intptr\u t
是可选的,尽管通常是实现的。此外,“…容纳任何对象指针转换为整数的结果。”。函数指针可能不是这样。