首页 > 解决方案 > arm-none-eabi-gcc 中的 UINT16_C 定义错误?

问题描述

我注意到 arm-none-eabi-gcc 10.2UINTN_C以下列方式定义宏(使用 编译-mcpu=cortex-m7 -std=c99 -g3 -O0):

#define UINT32_C(x) __UINT32_C(x)  
#define UINT16_C(x) __UINT16_C(x) 

然后

#define __UINT32_C(c) c ## UL
#define __UINT16_C(c) c

C99 标准(7.18.4.1 p2)说:

宏 UINTN_C(value) 应扩展为具有指定值和类型 uint_leastN_t 的无符号整数常量。

32 位版本确实扩展为无符号 32 位表示(uint_least32_tunsigned long此 CPU 上)。

然而,16 位版本扩展为有符号表示:UINT16_C(1)扩展为1类型为int.

是不是和标准相矛盾?有没有可以解决这个问题的 gcc 选项?

为什么不做类似的事情#define __UINT16_C(c) ((uint_least16_t)(c))

标签: cgccc99

解决方案


C 无法识别类型小于intand的数字文字的概念unsigned int。在int32 位的平台上,由于整数提升,表达式(uint16_t)123将表现为类型signed int,并且包含假定类型的数字文字的表达式的uint16_t行为方式与该类型将被处理。


推荐阅读