【发布时间】:2021-12-03 12:07:41
【问题描述】:
我注意到 arm-none-eabi-gcc 10.2 以以下方式定义宏 UINTN_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_t 在此 CPU 上是 unsigned long)。
但是 16 位版本扩展为有符号表示:UINT16_C(1) 扩展为 1,其类型为 int。
是不是和标准相矛盾?有没有可以解决这个问题的 gcc 选项?
为什么不做类似#define __UINT16_C(c) ((uint_least16_t)(c)) 的事情?
【问题讨论】:
-
您是否查看了相应的头文件以获取一些信息?
-
是的,我在 gcc 安装的整个目录中对
__UINTN_C进行了 grep,但没有找到 -
看起来这是gcc中常用的定义,例如sites.uclouvain.be/SystInfo/usr/include/stdint.h.html
-
嗯,我的 MinGW 安装显示例如
#define UINT32_C(val) (val##U),但我没有查看细节。 -
UINT32_C也一样。问题是 16 位和 8 位