为什么UINTX_C()宏没有在Windows stdint.h中正确定义
Why are the UINTX_C() macros not properly defined in Windows stdint.h?
在MVSC中,当I #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年的国际标准化组织C标准(C99)实际上在这方面有一个缺陷。它在7.18.4.1p2中指出,例如,INT8_C(
值)
扩展为具有指定值和类型CCD_ 10。这在一般情况下是不可能的(如果没有编译器扩展),因为C对于比int
窄的类型的整数常量没有语法(并且不能使用强制转换,因为结果必须在#if
表达式中可用——尽管原始C99标准中没有这一要求)。第一份技术勘误表更正了这一点,以回应缺陷报告#209,称该类型是根据整数促销。修正后的文本在C99的N1256草案和已发布的C11标准中。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 在Windows中以.exe的形式运行c++
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 无法在windows控制台中为C++程序提供必要的输入
- 在Windows中查找扬声器输出的当前音量级别
- Windows.h与GLFW.h的接口
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 为什么UINTX_C()宏没有在Windows stdint.h中正确定义
- 相当于gnu中windows stdint.h中的u_int16_t