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

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

在 MVSC 中,当我 #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头的内容<stdint.h>参考了C标准,最新的C++标准参考了1999年的C标准,不知道C99的三个技术地位如何勘误表是关于 C++ 的。)

正在查看 N1570 7.20.4p1:

The following function-like macros expand to integer constants suitable for initializing objects that have integer types corresponding to types defined in <stdint.h>. Each macro name corresponds to a similar type name in 7.20.1.2 or 7.20.1.5.

在第 3 段中:

The type of the expression shall have the same type as would an expression of the corresponding type converted according to the integer promotions.

(强调)

例如,int_least8_t 可能是 signed char 的类型定义。如果是这样,那么有一个像这样的定义是有意义的(并且符合):

#define INT8_C(x)   (x)

N1570 是 2011 ISO C 标准草案。 1999 年的 ISO C 标准(C99)实际上在这方面有一个错误。它指出,在 7.18.4.1p2 中,例如,INT8_C(value) 扩展为具有指定的有符号整数常量 值和类型 int_least8_t。这通常是不可能的(没有编译器扩展),因为 C 没有语法用于比 int 窄的整数常量类型(并且不能使用强制转换,因为结果必须在 #if 表达式——尽管该要求不在原始 C99 标准中)。 first Technical Corrigendum corrected this, in response to Defect Report # 209,也就是说类型是根据转换的对应类型 整数促销。更正后的文本位于 C99 的 N1256 草案和已发布的 C11 标准中。