【发布时间】:2014-08-25 21:54:06
【问题描述】:
我需要移植一个项目以使用带有自己的 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 是 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 与它自己的编译器一起使用。
【问题讨论】:
-
对此我不确定,但我认为将
%u用于uint32_t是未定义的,即使它的大小与unsigned int相同。所以这个警告可能是有道理的(尽管忽略它可能是安全的)。 -
建议
"%" PRIu32而不是"%u"。 -
@mafso 不,不是这样,因为 a) 这不是未定义的 b) typedefs 只是别名,所以如果
uint32_t真的被定义为unsigned int那么它们是完全相同的类型。我怀疑 OP 弄错了,unsigned int不是 32 位。打印sizeof(unsigned int)会确认。 -
@Jim Balter Printing
sizeof(unsigned int) * CHAR_BIT会进一步确认。 -
发布代码 main.c:173 可能会有所帮助。
标签: c gcc compiler-warnings uint32