MS Visual Studio 编译器提供哪些 C99 功能?

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

众所周知,微软的 Visual Studio 编译器不支持 C99,而且看起来他们没有计划支持它

但是,编译器确实包含一些精心挑选的功能,例如可变参数宏和

long long

 - 请参阅
这个答案中的引号:

当我们收到许多对某些 C99 功能的请求时,我们会尝试实现它们(或类似功能)。几个例子是可变参数宏、

long long

__pragma
__FUNCTION__
__restrict
。如果您发现其他 C99 功能对您的工作有用,请告诉我们!我们很少听到 C 用户的声音,所以请大声说出自己的想法

-- Arjun Bijanki,微软 ISO C 标准委员会代表

http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx

此外,较新版本的 Visual Studio 似乎附带了

C99 所需的一些标头

有很多关于特定功能的问题 - 但我不想知道的是:

在哪里可以找到当前 MSVC 编译器支持/提供的 C99 功能列表?

我正在寻找一个列表

就像 gcc 的列表

c visual-studio compiler-construction c99
2个回答
37
投票
幸运的是,微软在这个问题上的立场已经改变。 MSVC++ 版本 12.0(Visual Studio 2013 的一部分)

添加了支持

  • _Bool
    类型。
  • 复合文字。
  • 指定的初始值设定项。
  • 将声明与代码混合。
  • __func__
    预定义标识符。
您可以检查

_MSC_VER

是否大于或等于1800的值,以查看是否支持这些功能。 自 MSVC 14.0 (Visual Studio 2015) 以来,

标准库支持已更新且“基本完整”。此版本还添加了 inline 关键字。

restrict

关键字、一致的预处理器和

C11支持

出现在 Visual Studio 2019 版本 16.8 中,但这不包括一些在 C11 中可选的强制性 C99 功能。
Visual Studio 2022 版本 17.5 添加了对 C11 原子基元和类型

(

stdatomic.h) 的支持。

早期版本已经支持的功能(我认为至少从 MSVC 7.1 / Visual Studio 2003 开始):

//
    风格评论。
  • long long
  • 类型。
  • 灵活的数组成员(微软称它们为“未调整大小的数组”)。
  • 可变参数宏(至少部分)。
  • 还缺少的东西:

变长数组(C11中可选,未计划)。

  • _Complex
  • 型(C11可选,未规划)。
  • C11 多线程(可选功能,在路线图上)。
我相信 MSVC 支持的 C99 唯一非库语言功能(C90 中没有)是

9
投票
注释。除此之外,在 C 模式下编译时,您将获得的唯一 C99 功能是由于 Microsoft 引入的 C99 库功能,因为这些功能是在 MS 编译器支持的 C++ 标准/草案标准/TR 中引入的。例如,您在 VS 2010 中获得

stdint.h

,因为它位于 C++ TR1 草案中。
微软已经明确表示,他们认为市场没有强烈推动在 MSVC 中分配资源来支持 C99,因此几乎可以肯定,您在 MSVC 的 C 编译器模式中看到的 C99 的唯一部分是那些引入的部分,因为C++ 的。

令我

感到沮丧的一件事是,长期以来一直属于 C++ 一部分的非库 C99 语言功能在 C 模式下不可用。就我个人而言,如果在编译 C 代码时支持 C99 将语句与声明混合的能力,我会发现它非常有帮助。

但是您今天在 MSVC 中看到的 C 语言功能似乎就是您从这里开始获得的。

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