c - 编译为 cortex-m0 时,unsigned int 不是 uint32_t——可能是 C 编译器标志问题

标签 c gcc compiler-warnings uint32

我需要移植一个项目,以便使用带有自己的 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 与它自己的编译器一起使用。

最佳答案

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

如果您的实现有不止一种没有填充位的 32 位无符号整数类型,uint32_t可以是其中任何一个,由实现者一时兴起。

正在打印 uint32_t"%u"是不可携带的。如果您的实现恰好定义了 uint32_t,您就可以摆脱它作为unsigned int (你的显然没有)。如果unsigned int,你可能可以逃脱惩罚恰好是 32 位。

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);

关于c - 编译为 cortex-m0 时,unsigned int 不是 uint32_t——可能是 C 编译器标志问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494947/

相关文章:

c - 为什么 gcc 从不存在的文件夹中搜索头文件?

maven - 在不编辑 pom.xml 的情况下显示编译器警告

c++ - 使用复合赋值运算符解决转换警告

c++ - 计算结构大小而不填充字节的函数

c - 解码汇编回调

c++ - 模板类成员函数的完美转发返回类型

c - 检索当前可执行文件名称的 glibc 函数?

c# - 作为错误的警告 - 不适用于 Stylecop 警告

c - 双重释放或腐败(!prev)

c - 尝试使用 scanf() 获取多个变量