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

Tim*_*nes 35 c compiler-construction c99 visual-studio

这是众所周知,微软的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寻找像这样的列表.

nwe*_*hof 34

幸运的是,微软在这个问题上的立场发生了变化.MSVC++ 12.0版(Visual Studio中2013的一部分)加入支持

  • _Bool 类型.
  • 复合文字.
  • 指定的初始化程序.
  • 将声明与代码混合.
  • __func__ 预定标识符.

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

标准库的支持也进行了更新,主要是完成在MSVC 14.0(Visual Studio中2015年).

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

  • // 风格评论.
  • long long 类型.
  • 灵活的阵列成员(微软称它们为"未经过大小处理的阵列").
  • 变体宏(至少部分地).

仍然缺少的事情:

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


Mic*_*urr 9

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

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

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

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

  • 另一个更新:上面的引用表明"变量宏"和"long long"也在MSVC中 - 我忘记了"long long".我自己没有使用可变参数宏,所以我不确定它们在MSVC中的工作方式与C99指定的相同.引号`__pragma`,`__FUNCTION__`和`__restrict`中提到的其他C99功能与C99结构类似,但不完全相同.要使用它们"便携式"可能需要一些烦人的宏魔法来平滑差异(诚然可能是非常小的宏魔法). (2认同)