我需要移植一个项目来运行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与它自己的编译器一起使用。
1条答案
按热度按时间lb3vh1jj1#
uint32_t
是类型定义(别名)。该类型保证为32位宽,没有填充位。您不能安全地假设它是任何特定类型的别名。它可能是unsigned int
或unsigned long int
。(不太可信的是,在不常见的系统上它可能是unsigned char
或unsigned 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>
中的宏:(
PRIu32
扩展为字符串文字;这利用了相邻字符串文字被连接的事实。)更简单的方法是将值转换为已知类型:
或者也许: