5

我需要移植一个项目以使用带有自己的 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_t无符号整数。我已经包含了 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 与它自己的编译器一起使用。

4

1 回答 1

11

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

打印一个uint32_t"%u"是不可移植的。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 = %ju\n", (intmax_t)x);

也许:

uint32_t x = 42;
printf("x = %llu\n", (unsigned long long)x);
于 2014-08-25T23:33:19.793 回答