编译到cortex-m0时,unsigned int不是uint32\u t——可能是C编译器标志问题

编译到cortex-m0时,unsigned int不是uint32\u t——可能是C编译器标志问题,c,gcc,compiler-warnings,uint32,C,Gcc,Compiler Warnings,Uint32,我需要将一个项目移植到Eclipse中,并使用它自己的Makefile运行。我已经修改了它的makefile,我猜错误与它或编译器标志有关 主持人:Virtualbox Win 8,x64, 目标设备:nrf51822,即arm cortex-m0。 我使用gnu arm交叉编译器4.8.4(gnu工具arm嵌入式) Compile显示以下错误/警告消息: src/main.c:173:4: error: format '%u' expects argument of type 'unsigne

我需要将一个项目移植到Eclipse中,并使用它自己的Makefile运行。我已经修改了它的makefile,我猜错误与它或编译器标志有关

主持人:Virtualbox Win 8,x64, 目标设备:nrf51822,即arm cortex-m0。 我使用gnu arm交叉编译器4.8.4(gnu工具arm嵌入式)

Compile显示以下错误/警告消息:

src/main.c:173:4: error: format '%u' expects argument of type 'unsigned int', but argument 3 has type 'uint32_t' [-Werror=format=]
我不明白<在本例中,strong>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是否指定整数的大小?h预处理器宏应生成“typedef unsigned int\uu uint32\u t;”。Eclipse显示该行已编译,但我不知道是否信任它,因为外部makefile与它自己的编译器一起使用。

uint32\u t
是某些预定义的无符号整数类型的typedef(别名)。该类型保证正好是32位宽,没有填充位。您不能安全地假定它是任何特定类型的别名。它可能是
无符号整数
无符号长整数
。(不太合理的是,它可以是
无符号字符
无符号短字符
,也可以是扩展整数类型;它不能是
无符号长字符
,至少64位宽。)

使用
“%u”
打印
uint32\t
值是不可移植的。如果您的实现碰巧将
uint32\u t
定义为
unsigned int
(您的实现显然没有定义),那么您可以不受影响。如果
unsigned int
恰好是32位,您可能可以不受影响

中的宏定义了
uint32\t
的正确格式:

PRIu32
扩展为字符串文字;这利用了相邻字符串文字串联的事实。)

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

uint32_t x = 42;
printf("x = %ju\n", (intmax_t)x);
或许:

uint32_t x = 42;
printf("x = %llu\n", (unsigned long long)x);

我不确定这一点,但我认为对
uint32\u t
使用
%u
是未定义的,即使它的大小与
unsigned int
相同。因此,警告可能是有道理的(尽管可以安全地忽略它)。建议
“%”PRIu32
而不是
“%u”
@mafso不,不是这样,因为a)这不是未定义的,b)typedef只是别名,所以如果
uint32\u t
真的被typedef定义为
unsigned int
,那么它们是完全相同的类型。我怀疑运算是错误的,
unsigned int
不是32位。打印
sizeof(unsigned int)
会得到确认。@Jim Balter打印
sizeof(unsigned int)*CHAR\u BIT
会得到更多确认。发布代码main.c:173可能会有帮助。我明白你的意思。实际上,我已经设法在_default_types.h(包含在stdint.h中)中找到了typedef UINT32_TYPE u UINT32_t;看起来这个宏是由编译器设置的。如何使用PRIu32?编译器告诉:printf(“x=%“PRIu32”\n”,(uint32\u t)3);src/main.c:174:19:error:expected')在'PRIu32'之前@Dati:You need
#include
uint32_t x = 42;
printf("x = %llu\n", (unsigned long long)x);