在 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标准包含了C头文件<stdint.h>
的内容,最新的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(
值 )
扩展为具有指定的有符号整数常量
值和类型 int_least8_t
.这通常是不可能的(没有编译器扩展),因为 C 没有针对窄于 int
类型的整数常量的语法。 (并且不能使用强制转换,因为结果必须在 #if
表达式中可用——尽管原始 C99 标准中没有该要求)。 first Technical Corrigendum更正了这一点,以回应 Defect Report # 209 , 表示类型是根据转换的对应类型
整数促销。更正后的文本在 N1256 中C99 草案和已发布的 C11 标准。
关于c++ - 为什么 UINTX_C() 宏没有在 Windows stdint.h 中正确定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28819913/