【问题标题】:Which C99 features are available in the MS Visual Studio compiler?MS Visual Studio 编译器中提供了哪些 C99 功能?
【发布时间】:2012-03-25 12:40:18
【问题描述】:

众所周知,微软的Visual Studio编译器不支持C99,貌似他们有no planssupport it

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

我们收到了很多关于某些 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 似乎附带 some of the headers required by C99

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

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

【问题讨论】:

  • 没有。您所指的所有功能都是 C++ 功能。
  • @Jesse:我已经更新了问题,以明确 Visual Studio 编译器有意支持一些 C99 功能。
  • 如果你想使用 C99,为什么不使用支持它的编译器呢?
  • @Timothy Jones:在您添加的引文中,它说we’ve tried to implement them (or analogues).,这意味着它们不是 C99 功能,而是完全相同的复制品。有区别。

标签: c visual-studio compiler-construction c99


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,+1。您是说// cmets 是Visual Studio 支持唯一的非库 C99 功能吗?你知道stdint.h之类的库头文件是否在C模式下工作?
  • “在 Visual Studio 中支持” - 是的。我将更新问题以澄清这一点。并且有几次我在 C 模式下使用 MSVC 提供的 C99 库头文件,它们运行良好。
  • 另一个更新:上面的引用表明“可变参数宏”和“long long”也在 MSVC 中——我忘记了 long long。我自己没有使用可变参数宏,所以我不确定它们在 MSVC 中的工作方式是否与 C99 指定的相同。引用 __pragma__FUNCTION____restrict 中提到的其他 C99 功能与 C99 构造相似,但并不完全相同。要使用它们“便携”,可能需要一些恼人的宏魔法来消除差异(诚然,可能是非常小的宏魔法)。
【解决方案2】:

幸运的是,微软在这个问题上的立场已经改变。 MSVC++ 12.0 版(Visual Studio 2013 的一部分)added support 用于

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

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

Standard library support 已更新,自 MSVC 14.0 (Visual Studio 2015) 起为 mostly complete。此版本还添加了inline 关键字。

restrict 关键字、一致的预处理器和 C11 support 已在 Visual Studio 2019 版本 16.8 中出现,但这不包括在 C11 中可选的一些强制性 C99 功能。

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

  • // 风格 cmets。
  • long long 类型。
  • 灵活的数组成员(Microsoft 称它们为“未调整大小的数组”)。
  • 可变参数宏(至少部分)。

仍然缺少的东西:

  • 可变长度数组(C11 中可选,未计划)。
  • _Complex 类型(C11 中可选,未计划)。
  • C11 多线程(可选功能,在路线图上)。
  • C11 原子原语和类型(可选功能,在路线图上)。

【讨论】:

  • 谢谢!我不经常检查堆栈溢出,所以直到现在我才看到这个。接受!
  • 值得一提的是16.8支持restrict关键字,即使使用默认的C89+部分C99。这是一个潜在的混乱情况,因为 16.8 之前的 VS2017 和 VS2019 不支持它。 Microsoft 确认 /std:c17 启用了对它的支持,但没有告诉你它也支持它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多