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

时间:2012-03-07 23:27:20

标签: c visual-studio compiler-construction c99

众所周知,Microsoft的Visual Studio编译器不支持C99,看起来他们有no planssupport it

但是,编译器确实包含了一些樱桃挑选的功能,如可变参数宏和long long - 请参阅this answer中的引号:

  

我们已收到许多针对某些C99功能的请求,我们已尝试实施它们(或类似物)。一些示例是可变参数宏,long long__pragma__FUNCTION____restrict。如果您在工作中发现其他C99功能,请告诉我们!我们没有从我们的C用户那里听到太多,所以大声说出来并让自己听到

     

- 微软ISO C标准委员会代表Arjun Bijanki http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx

此外,较新版本的Visual Studio似乎附带some of the headers required by C99

关于特定功能有很多问题 - 但我不知道的是:我在哪里可以找到当前MSVC编译器支持/提供的C99功能列表?

我正在寻找列表like this one for gcc

2 个答案:

答案 0 :(得分:33)

幸运的是,微软在这个问题上的立场已经发生了变化。 MSVC ++版本12.0(Visual Studio 2013的一部分)added support for

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

您可以检查_MSC_VER macro的值是否大于或等于1800,以查看是否支持这些功能。

Standard library support也已更新,在MSVC 14.0(Visual Studio 2015)中为mostly complete

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

  • //样式评论。
  • long long类型。
  • 灵活的阵列成员(Microsoft称其为“未经过大小处理的阵列”)。
  • Variadic宏(至少部分)。

仍然缺少的事情:

  • 可变长度数组(C11中可选)。
  • 支持inline关键字(您可以使用__inline,但语义可能略有不同)。
  • 支持restrict关键字(您可以使用__restrict)。
  • 来自tgmath.h的类型通用数学函数。
  • _Complex类型(C11中可选)。

答案 1 :(得分:9)

我相信MSVC支持的C99(不在C90中)唯一的非库语言功能是//注释。除了在C模式下编译时,您将获得的唯一C99功能是由于Microsoft带来的C99库功能,因为这些功能是在MS编译器支持的C ++标准/草案标准/ TR中引入的。例如,您在VS 2010中获得stdint.h,因为它在C ++ TR1草案中。

微软明确表示他们没有看到市场上没有强大的推动来分配资源来支持MSVC中的C99,所以几乎可以肯定的是,你在MSVC的C编译器模式中看到的C99的唯一部分是带来的因为C ++而已。

发现令人沮丧的事情之一是,C库模式下无法使用已经长时间使用C ++的非库C99语言功能。就个人而言,如果在编译C代码时只支持C99将语句与声明混合的能力,我会发现它非常有用。

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