【问题标题】:unsigned int is not uint32_t when compile to cortex-m0 -- possible C compiler flag issue编译到 cortex-m0 时 unsigned int 不是 uint32_t - 可能的 C 编译器标志问题
【发布时间】:2014-08-25 21:54:06
【问题描述】:

我需要移植一个项目以使用带有自己的 Makefile 的 Eclipse 运行。我已经修改了它的makefile,我猜错误是连接到它或编译器标志。

主机:Virtualbox Win 8,x64, 目标设备:nrf51822,即 arm cortex-m0。 我使用 gnu arm cross compiler 4.8.4 (GNU Tools ARM Embedded)

编译显示以下错误/警告消息:

src/main.c:173:4: error: format '%u' expects argument of type 'unsigned int', but argument 3 has type 'uint32_t' [-Werror=format=]

我不明白。在这种情况下,uint32_tunsigned int。我已经包含了 stdint.h。

我使用以下标志编译源代码:

CFLAGS += -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu11 -funsigned-char -DNRF51 -DDEBUG_NRF_USER -DBLE_STACK_SUPPORT_REQD -DBOARD_PCA10000 -DNRF51822_QFAA_CA
CFLAGS += -Wall -Werror
CFLAGS += -mfloat-abi=soft

-mcpu=cortex-m0 不指定整数的大小吗? stdint.h 预处理器宏应生成“typedef unsigned int __uint32_t;”。 Eclipse 显示该行已编译,但我不知道是否信任它,因为外部 makefile 与它自己的编译器一起使用。

【问题讨论】:

  • 对此我不确定,但我认为将%u 用于uint32_t 是未定义的,即使它的大小与unsigned int 相同。所以这个警告可能是有道理的(尽管忽略它可能是安全的)。
  • 建议"%" PRIu32 而不是"%u"
  • @mafso 不,不是这样,因为 a) 这不是未定义的 b) typedefs 只是别名,所以如果 uint32_t 真的被定义为 unsigned int 那么它们是完全相同的类型。我怀疑 OP 弄错了,unsigned int 不是 32 位。打印sizeof(unsigned int) 会确认。
  • @Jim Balter Printing sizeof(unsigned int) * CHAR_BIT 会进一步确认。
  • 发布代码 main.c:173 可能会有所帮助。

标签: c gcc compiler-warnings uint32


【解决方案1】:

uint32_tsome 预定义的无符号整数类型的 typedef(别名)。该类型保证为 32 位宽,没有填充位。您不能安全地假定它是任何特定类型的别名。它可能是unsigned intunsigned long int。 (不太合理的是,它可能是一个不寻常的系统上的unsigned charunsigned short,或者它可能是一个扩展整数类型;它不能是至少64 位宽的unsigned long long。 )

使用"%u" 打印uint32_t 值是不可移植的。如果您的实现碰巧将uint32_t 定义为unsigned int(您的显然没有),您可以侥幸逃脱。如果unsigned int 恰好是 32 位,您可能可以侥幸逃脱。

uint32_t 的正确格式定义为<inttypes.h> 中的宏:

uint32_t x = 42;
printf("x = %" PRIu32 "\n", x);

PRIu32 扩展为字符串文字;这利用了相邻字符串文字被连接的事实。)

更简单的方法是将值转换为已知类型:

uint32_t x = 42;
printf("x = %ju\n", (intmax_t)x);

或许:

uint32_t x = 42;
printf("x = %llu\n", (unsigned long long)x);

【讨论】:

  • 我明白你的意思。实际上我已经设法在 _default_types.h (包含在 stdint.h 中) typedef UINT32_TYPE __uint32_t;而且看起来这个宏是编译器设置的。
  • 如何使用PRIu32?编译器告诉: printf("x = %" PRIu32 "\n", (uint32_t)3); src/main.c:174:19: 错误: 'PRIu32'之前的预期')'
  • @Dati:你需要#include <inttypes.h>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2021-12-10
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
相关资源
最近更新 更多