2

C99 定义int_fast16_t为“通常最快且至少具有指定宽度的整数类型”,Microsoft 在 MSVC 2010 中将其定义为 32 位整数:

typedef char int_fast8_t;
typedef int int_fast16_t;
typedef int int_fast32_t;

typedef unsigned char uint_fast8_t;
typedef unsigned int uint_fast16_t;
typedef unsigned int uint_fast32_t;

然而,微软已经设置了不反映实际基础数据类型的限制:

#define INT_FAST8_MIN       (-0x7f - _C2)
#define INT_FAST16_MIN      (-0x7fff - _C2)
#define INT_FAST32_MIN      (-0x7fffffff - _C2)

#define INT_FAST8_MAX       0x7f
#define INT_FAST16_MAX      0x7fff
#define INT_FAST32_MAX      0x7fffffff
#define UINT_FAST8_MAX      0xff
#define UINT_FAST16_MAX     0xffff
#define UINT_FAST32_MAX     0xffffffff

人们会假设该标准的意图是如下所示:

#define INT_FAST16_MIN      (-0x7fffffff - _C2)
#define INT_FAST16_MAX      0x7fffffff
#define UINT_FAST16_MAX     0xffffffff

否则这会使常量完全多余?

编辑:如预期的 NetBSD 设置示例:

/* Maximum values of fastest minimum-width signed integer types. */
#define INT_FAST8_MAX   INT32_MAX
#define INT_FAST16_MAX  INT32_MAX
#define INT_FAST32_MAX  INT32_MAX
#define INT_FAST64_MAX  INT64_MAX

http://fxr.watson.org/fxr/source/arm/include/_stdint.h?im=3

4

1 回答 1

1

这是一个错误。MSVC 是一个 C++ 编译器,Microsoft 从未专注于支持更新的 C 标准。VS 2010 是第一个 MSVC 版本,<stdint.h>不出所料会有很多问题。

微软软件架构师兼 ISO C++ 标准委员会主席 Herb Sutter 写道

1. 我们的主要目标是支持“作为 ISO C++98/C++11 子集的大部分 C99/C11”。

VC++ 2010 已经完全支持 C++98 的 C 子集,包括块中间的东西<stdint.h>和声明。[*] C++98 的 C 子集大约是 C95(与 C95 的不兼容性很少;即,在极少数情况下,合法的 C95 代码具有不同的含义或在 C++98 中无效)以及一些 C99 功能,例如在块中间声明变量)。

读者问答:VC++ 和 C99 怎么样?

但真正支持某些C99 功能的第一个版本是VS 2013,在 VS2015 中引入了更多功能

C99 一致性 Visual Studio 2015 完全实现了 C99 标准库,但依赖于 Visual C++ 编译器尚不支持的编译器功能的任何库功能除外(例如,未实现)。

Visual Studio 2015 中 Visual C++ 的新增功能

但即使是现在VS 2017VS 2019仍然不支持 C99/C11 的所有功能

编译器对 C99 预处理器规则的支持在 Visual Studio 2017 中不完整。我们正在彻底检查预处理器,并开始在 Visual Studio 2017 版本 15.8 中使用 /experimental:preprocessor 编译器开关提供这些更改。

Microsoft C++ 语言一致性表


我无法安装 VS2010,但我检查了 VS 2012,发现 stdint.h 中的定义已修复。这是相关部分C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\stdint.h

...
typedef signed char        int_fast8_t;
typedef int                int_fast16_t;
typedef int                int_fast32_t;
typedef long long          int_fast64_t;
typedef unsigned char      uint_fast8_t;
typedef unsigned int       uint_fast16_t;
typedef unsigned int       uint_fast32_t;
typedef unsigned long long uint_fast64_t;
...
#define INT_FAST8_MIN    INT8_MIN
#define INT_FAST16_MIN   INT32_MIN
#define INT_FAST32_MIN   INT32_MIN
#define INT_FAST64_MIN   INT64_MIN
#define INT_FAST8_MAX    INT8_MAX
#define INT_FAST16_MAX   INT32_MAX
#define INT_FAST32_MAX   INT32_MAX
#define INT_FAST64_MAX   INT64_MAX
#define UINT_FAST8_MAX   UINT8_MAX
#define UINT_FAST16_MAX  UINT32_MAX
#define UINT_FAST32_MAX  UINT32_MAX
#define UINT_FAST64_MAX  UINT64_MAX
...
/*
 * Copyright (c) 1992-2012 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
V6.00:0009 */

VS 2013 中的标头是一样的

于 2020-01-07T08:53:06.127 回答