为什么 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 标准中。
在 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 标准中。