[英]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标准包含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 年的 ISO C 标准 (C99) 实际上在这方面存在错误。 它在 7.18.4.1p2 中指出,例如, INT8_C(
value )
扩展为具有指定值和类型int_least8_t
有符号整数常量。 这在一般情况下是不可能的(没有编译器扩展),因为 C 没有类型比int
更窄的整数常量的语法(并且不能使用#if
因为结果必须在#if
表达式中可用——尽管这个要求不在原始 C99 标准中)。 第一个技术勘误更正了这一点,响应缺陷报告#209 ,说该类型是根据整数提升转换的相应类型。 更正后的文本位于 C99 的N1256草案和已发布的 C11 标准中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.