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

标签 c++ macros windows-7-x64 language-lawyer

在 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/

相关文章:

c++ - 尝试连接两种不同类型的结构以创建链表

c - 左移计数 >= C 宏中类型的宽度

java - 如何解决在一台计算机上有效但在另一台计算机上无效的 ArrayIndexOutOfBoundsException?

ms-access - 注册 MSCOMCTL.OCX 后,TreeView 控件仍不可用

java - 在 Windows7-Jenkins-Slave 上远程运行 Swing-Tests

c++ - 如何在 NaCl 模块中使用移植库?

c++ - 是否可以使用数组拷贝来复制 vector 的一部分?

c++ - 可视化并分析C++项目中类的关系

macros - Racket 宏不起作用

scala - 如何使用 Shapeless 或 Macro 获取 Scala 案例类字段和值(字符串、字符串)