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

Kyl*_*leL 0 c++ macros language-lawyer windows-7-x64

在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))
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 8

据我所知,这是正确定义的.

宏扩展到整数常量表达式对应于未指定类型,指定类型.

C和C++都没有类型的整数常量表达式的语法int.它取决于隐式转换,int以便在需要时将表达式转换为更窄的类型.

(C++ <stdint.h>通过引用C标准包含C头的内容.最新的C++标准是指1999 C标准.我不确定三个C99技术勘误的状态是什么.关于C++.)

看看N1570 7.20.4p1:

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

在第3段中:

表达式的类型应与根据整数提升转换的相应类型的表达式具有相同的类型.

(重点补充)

例如,int_least8_t很可能是一个typedef signed char.如果是这样,那么有一个定义是合理的(并且符合要求):

#define INT8_C(x)   (x)
Run Code Online (Sandbox Code Playgroud)

N1570是2011 ISO C标准的草案.1999 ISO C标准(C99)实际上在这个领域有一个错误.它在7.18.4.1p2中指出,例如,INT8_C()会扩展为具有指定值和类型的有符号整数常量int_least8_t.这通常是不可能的(没有编译器扩展)因为C没有类型的整数常量的语法int(并且不能使用强制转换,因为结果必须在#if表达式中可用- 尽管该要求不是在原C99标准中).第一个技术勘误更正了这一点,以回应缺陷报告#209,说明类型是根据整数促销转换的相应类型.更正的文本在C99 的N1256草案和公布的C11标准中.