代码之家  ›  专栏  ›  技术社区  ›  KyleL

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

  •  0
  • KyleL  · 技术社区  · 9 年前

    在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上是否有不同的文件可用于获得正确的定义?

    1 回复  |  直到 9 年前
        1
  •  9
  •   Keith Thompson    5 年前

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

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

    C和C++都没有比 int 。它依赖于隐式转换来转换 整数 根据需要将表达式转换为更窄的类型。

    (C++包含C头的内容 <stdint.h> 参照C标准。最新的C++标准是指1999年的C标准。我不确定三个C99技术勘误表相对于C++的状态如何。)

    正在查看 N1570 7.20.4p1:

    以下类似函数的宏扩展为整数常量 适用于初始化具有整数类型的对象 对应于中定义的类型 <标准时间> 。每个宏名称 对应于7.20.1.2或7.20.1.5中的类似类型名称。

    在第3段中:

    表达式的类型应与 对应类型的表达式 根据 整数促销 .

    (添加强调)

    例如 int_least8_t 很可能是的typedef 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对于小于 整数 (并且不能使用强制转换,因为结果必须在 #if 表达式——尽管最初的C99标准中没有该要求)。这个 first Technical Corrigendum 对此进行了更正,以回应 Defect Report # 209 ,表示该类型是对应的类型 根据 整数促销 。更正的文本位于 N1256 C99草案和已发布的C11标准。