我需要移植项目以使用自己的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与它自己的编译器一起使用。
答案 0 :(得分:8)
uint32_t
是某些预定义无符号整数类型的typedef(别名)。该类型保证正好是32位宽,没有填充位。您无法安全地假设它是任何特定类型的别名。它可能合理地是unsigned int
或unsigned long int
。 (不太合理,在一个不寻常的系统上可能是unsigned char
或unsigned 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}}