编译到cortex-m0时,unsigned int不是uint32_t - 可能是C编译器标志问题

时间:2014-08-25 21:54:06

标签: c gcc compiler-warnings uint32

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

主机:Virtualbox Win 8,x64, 目标设备:nrf51822,它是arm cortex-m0。 我使用gnu arm交叉编译器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_t unsigned 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与它自己的编译器一起使用。

1 个答案:

答案 0 :(得分:8)

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

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

<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);

或者也许:

{{1}}