gcc 编译到cortex-m0时,无符号整数不是uint32_t--可能是C编译器标志问题

sh7euo9m  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(222)

我需要移植一个项目来运行Eclipse,它有自己的makefile。我修改了它的makefile,我猜错误是与它或编译器标志有关。
主机:Virtualbox Win 8,x64,目标设备:nrf51822,这是ARM cortex-m0。我使用GNU ARM交叉编译器4.8.4(GNU工具ARM嵌入式)
编译显示以下错误/警告消息:

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与它自己的编译器一起使用。
lb3vh1jj

lb3vh1jj1#

uint32_t是类型定义(别名)。该类型保证为32位宽,没有填充位。您不能安全地假设它是任何特定类型的别名。它可能是unsigned intunsigned long int。(不太可信的是,在不常见的系统上它可能是unsigned charunsigned short,或者它可能是 * 扩展整数类型 *;它不能是unsigned long long,因为unsigned long long至少为64位宽。)
如果您的实现有多个没有填充位的32位无符号整数类型,则uint32_t可以是它们中的任何一个,这由实现者决定。
"%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);

相关问题