为什么UINTX_C()宏没有在Windows stdint.h中正确定义

Why are the UINTX_C() macros not properly defined in Windows stdint.h?

本文关键字:stdint Windows 定义 UINTX 为什么      更新时间:2023-10-16

在MVSC中,当I #include <stdint.h>时,我最终得到UINTX_C和INTX_C宏的以下定义:

#define INT8_C(x)   (x)
#define INT16_C(x)  (x)
#define INT32_C(x)  ((x) + (INT32_MAX - INT32_MAX))
#define UINT8_C(x)  (x)
#define UINT16_C(x) (x)
#define UINT32_C(x) ((x) + (UINT32_MAX - UINT32_MAX))

很明显,8位和16位宏只是未经修改地通过常量,这并不能完全执行它们的设计。在Windows上是否有不同的文件可以包含以获得正确的定义?

据我所知,它们的定义是正确的。

宏扩展为整数常量表达式,对应于指定类型的,而不是指定类型的

C和C++都没有用于类型窄于int的整数常量表达式的语法。在需要的地方,将int表达式转换为更窄的类型取决于隐式转换。

(C++参考C标准包含了C头<stdint.h>的内容。最新的C++标准参考了1999年的C标准。我不确定C99三个技术勘误表相对于C++的状态如何。)

查看N1570 7.20.4p1:

以下类似函数的宏扩展为整数常量适用于初始化具有整数类型的对象对应于<stdint.h>中定义的类型。每个宏名称对应于7.20.1.2或7.20.1.5中的类似类型名称。

第3段:

表达式的类型应与根据整数促销。

(增加重点)

例如,int_least8_t可能是signed char的typedef。如果是这样的话,有一个像这样的定义是有意义的(并且是一致的)

#define INT8_C(x)   (x)

N1570是2011年ISO C标准的草案。1999年的国际标准化组织C标准(C99)实际上在这方面有一个缺陷。它在7.18.4.1p2中指出,例如,INT8_C()扩展为具有指定值和类型CCD_ 10。这在一般情况下是不可能的(如果没有编译器扩展),因为C对于比int窄的类型的整数常量没有语法(并且不能使用强制转换,因为结果必须在#if表达式中可用——尽管原始C99标准中没有这一要求)。第一份技术勘误表更正了这一点,以回应缺陷报告#209,称该类型是根据整数促销。修正后的文本在C99的N1256草案和已发布的C11标准中。