编译为 cortex-m0 时不会uint32_t无符号 int -- 可能的 C 编译器标志问题



我需要移植一个项目,使其使用自己的Makefile与Eclipse一起运行。我已经修改了它的制作文件,我想错误与它或编译器标志有关。

主机: 虚拟盒子赢 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无符号的 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 与它自己的编译器一起使用。

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

如果您的实现具有多个没有填充位的 32 位无符号整数类型,则uint32_t可能是其中任何一个,由实现者随心所欲。

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

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

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

(PRIu32扩展到字符串文本;这利用了相邻字符串文本连接的事实。

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

uint32_t x = 42;
printf("x = %jun", (intmax_t)x);

或者也许:

uint32_t x = 42;
printf("x = %llun", (unsigned long long)x);

最新更新