【问题标题】:Cast from uint8_t pointer to uint32_t integer compilation error从 uint8_t 指针转换为 uint32_t 整数编译错误
【发布时间】:2018-06-02 15:07:55
【问题描述】:

编译过程中出现以下错误:

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_t * 的类型。

HWREG 宏如下所示:

#define HWREG(x)                                                              \
        (*((volatile uint32_t *)(x)))

我对 C 及其指针没有经验,但大概我可以通过将 uint32_t 转换为 uintptr_t 来解决它。对吗?

我想确认一下,因为 uintptr_t 的名称中似乎没有与 uint32_t 不同的任何大小。

【问题讨论】:

  • 是的。 uintptr_t 而不是 uint32_t 应该修复它。
  • 我猜硬件是 32 位的。我相信这是问题所在:HWREG(AES_DMAC_CH0_EXTADDR) = (uint32_t)pui8MsgIn; 我怀疑您需要右侧为(uint32_t*)(void*)pui8MsgIn; 以避免在现代编译器(如 GCC 和 Clang)下出现错误和后续警告。 Clang 通常需要额外的中间转换以避免额外的警告。

标签: c pointers casting


【解决方案1】:

大概我可以通过将uint32_t 转换为uintptr_t 来解决它。 对吗?

是的。 uintptr_t 被指定为无符号整数类型,其宽度足以容纳任何指针到整数的转换结果。

我想确认一下,因为 uintptr_t 似乎没有任何大小 它的名字与 uint32_t 相反。

这就是重点(不是双关语)。 C 没有指定指针的大小,实际上这在实现之间有所不同。如果必须容纳所有实现的指针,则不能在类型名称中指定特定大小。

【讨论】:

  • 详细信息:“C 没有指定指针有多大”包括指针可能比所有整数类型都宽。类型(u)intptr_t 是可选的,但通常实现。还“...容纳将任何 object 指针转换为整数的结果。”。函数指针可能不是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2014-07-23
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
相关资源
最近更新 更多