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

问题描述 投票:0回答:1

在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++ macros windows-7-x64 language-lawyer
1个回答
9
投票

据我所知,它们定义正确。

宏扩展为整数常量表达式对应于指定类型,而不是of指定类型。

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表达式中使用) (但原始C99标准中没有此要求)。 first Technical Corrigendum响应Defect Report # 209对此进行了更正,说该类型是相应的类型根据整数促销。更正后的文本在C99的N1256草案和已发布的C11标准中。

© www.soinside.com 2019 - 2024. All rights reserved.