102

我一直在阅读有关 C99 和 C++11 以及所有这些完全甜蜜的东西,它们被添加到语言标准中,将来可能会很好用。然而,我们目前在 Visual Studio 中编写 C++ 的土地上苦苦挣扎。

标准中的任何新内容是否会被添加到 Visual Studio 中,或者微软是否更有兴趣添加新的 C# 变体来做到这一点?

编辑:除了接受的答案之外,我还找到了 Visual C++ 团队博客:

http://blogs.msdn.com/vcblog/

具体来说,其中的这篇文章:

https://web.archive.org/web/20190109064523/https://blogs.msdn.microsoft.com/vcblog/2008/02/22/tr1-slide-decks/

很有用。谢谢!

4

12 回答 12

103

MS对此有一系列公开回复,其中大多数都指责他们的用户。像这个:

https://devblogs.microsoft.com/cppblog/iso-c-standard-update/

现在,Visual C++ 编译器团队偶尔会收到关于我们为什么没有实现 C99 的问题。它实际上是基于我们用户的兴趣。我们收到了许多对某些 C99 功能的请求,我们尝试实现它们(或类似物)。几个例子是可变参数宏、long long__pragma__FUNCTION____restrict。如果您发现其他 C99 功能对您的工作有用,请告诉我们!我们从 C 用户那里听到的消息不多,所以大声说出来,让自己听到

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=345360

嗨:不幸的是,我们从大多数用户那里得到的压倒性反馈是,他们更愿意我们专注于 C++-0x 而不是 C-99。我们已经“精心挑选”了某些流行的 C-99 特性(可变参数宏long long),但除此之外,我们不太可能在 C-99 领域做更多的事情(至少在短期内)。

乔纳森洞穴

Visual C++ 编译器团队。

这是一种非常可悲的情况,但如果您怀疑 MS 想要锁定用户,这也是有道理的:将现代基于 gcc 的代码移植到 MSVC 中变得非常困难,至少我觉得这非常痛苦。

但是,存在一种解决方法:请注意,英特尔对此更加开明。英特尔 C 编译器可以处理 C99 代码,甚至具有与 gcc 相同的标志,从而更容易在平台之间移植代码。此外,英特尔编译器在 Visual Studio 中工作。因此,通过废弃 MS COMPILER,您仍然可以使用您认为具有某种价值的 MS IDE,并使用 C99 来满足您的需求。

老实说,一个更明智的方法是转移到 Intel CC 或 gcc,并在您的编程环境中使用 Eclipse。根据我的经验,跨 Windows-Linux-Solaris-AIX-etc 的代码可移植性通常很重要,不幸的是,MS 工具根本不支持这一点。

于 2008-09-28T18:24:11.043 回答
37

Herb Sutter 是 C++ 标准化委员会的主席和非常活跃的成员,同时也是 Visual Studio for Microsoft 的软件架构师。

他是为 C++0x 标准化的新 C++ 内存模型的作者之一。例如以下论文:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2669.htm
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007 /n2197.pdf

有他的名字。所以我想只要 H. Sutter 留在微软,C++0x 就可以包含在 Windows 上。

至于 C99 仅部分包含在 Visual Studio 中,我想这是一个优先级问题。

  • 最有趣的 C99 功能已经存在于 C++ 中(内联、随处声明变量、// 注释等),并且可能已经在 Visual Studio 的 C 中可用(如果只在 C++ 编译器中编写 C 代码)。有关 C++ 中 C99 功能的更完整讨论,请参阅我的答案。
  • C99 通过添加 C++ 中已经存在的功能,但以不兼容的方式增加了 C 和 C++ 之间的差异(抱歉,C99 中的布尔复杂实现是可笑的,充其量是...参见http://david.tribble.com/文本/cdiffs.htm了解更多信息)
  • Windows 上的 C 社区似乎不存在或不够重要以至于无法得到承认
  • Windows 上的 C++ 社区似乎太重要了,不容忽视
  • .NET 是微软希望人们在 Windows 上编程的方式。这意味着 C#、VB.NET,也许是 C++/CLI。

那么,我会是微软吗,当大多数人已经使用的社区活跃语言已经提供了相同的功能时,为什么我要实现很少人会使用的功能?

结论?

C++0x 将被包括在内,作为 VS 2008 的扩展,或在 Visual Studio 的下一代(几代?)中。

尚未实现的 C99 功能不会在未来几年内推出,除非发生一些戏剧性的事情(一个充满 C99 开发人员的国家突然出现?)

编辑 2011-04-14

显然,“充满C99开发者的国家”已经存在:http: //blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^_^

不过,我猜,http: //blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778上的最后一条评论已经足够清楚了。

编辑 2012-05-03

Herb Sutter 明确表示:

  1. 我们的主要目标是支持“作为 ISO C++98/C++11 子集的大部分 C99/C11”。
  2. 由于历史原因,我们还发布了一个 C90 编译器,它接受(仅)C90 而不是 C++
  3. 我们不打算支持不属于 C90 或 ISO C++ 的 ISO C 功能。

博客文章为这些决定添加了链接和进一步的解释。

来源:http ://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/

于 2008-09-28T19:34:15.367 回答
11

VC2013 preview 1 , C99 开始,支持更多样化的 C++11 和一些新引入的 C++14 标准。查看官方博客了解更多详情:http: //blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview。 aspx

更新:

来自https://news.ycombinator.com/item?id=9434483(Stephan T Lavavej aka:STL 是 STL @VC 团队的维护者):

具体来说,在 2015 年,我们的 C99 标准库实现已经完成,除了 tgmath.h(与 C++ 无关)和 CX_LIMITED_RANGE/FP_CONTRACT pragma 宏。

查看这篇文章了解详情:http: //blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx

于 2013-06-27T16:47:51.553 回答
8

我参与了 ISO C++ 工作(2000-2005 年),微软为该语言做出了重大贡献。毫无疑问,他们将在 C++0x 上工作,但他们需要比 Intel 更多的时间。Micosoft 必须处理经常使用其专有扩展的更大代码库。这只是使测试时间更长。然而,它们最终将支持大多数 C++0x(尽管导出仍然不受欢迎,或者我理解)。

谈到 ISO C,从事标准工作的人并不能代表微软的市场。如果微软的客户只是在寻找更好的 C,他们可以使用 C++98。那么微软为什么要在 C99 上花钱呢?当然,微软精心挑选了部分,但这是明智之举。他们无论如何都需要那些用于 C++0x 的,所以为什么要等呢?

于 2008-09-29T12:19:12.580 回答
7

不幸的是,MSVC 对 C 的支持非常缺乏。它仅支持作为 C++ 子集的 C99 部分……这意味着,例如,在 MSVC 中编译 ffmpeg 或其 libav* 库在物理上是不可能的,因为它们使用了许多 C99 特性,例如命名的结构元素。由于 libavcodec 还需要一个维护堆栈对齐的编译器,而 MSVC 不需要,这使情况变得更糟。

我在 x264 上工作,与 ffmpeg 不同,它确实努力支持 MSVC,尽管这样做本身就是一场噩梦。即使您通过显式的基于汇编的堆栈对齐函数显式传递最高函数调用,它也不会保持堆栈对齐,因此必须禁用所有需要对齐堆栈的函数。我也不能使用可变数组也很烦人;也许这是最好的,因为显然 GCC 在性能方面严重悲观它们。

于 2008-09-28T19:45:42.437 回答
6

一篇关于 MSVC 对 MSVC 2010 和 2011 的 C++11 功能兼容性的更新文章现已上线

于 2011-10-14T17:15:32.643 回答
4

微软从未表示过真正有兴趣跟上 c99 标准(现在已经过时了)。为 C 程序员感到难过,但我怀疑微软更关心 C++ 社区。

于 2008-09-28T18:12:57.497 回答
4

Visual C++ 2008 SP1 至少包含 TR1 的部分内容,而且 Visual C++ 团队时不时地在博客或谈论 C++0x,所以我猜他们会在某个时候在该功能中支持它。虽然我没有读过任何官方的东西。

于 2008-09-28T18:19:13.083 回答
4

这方面的更新信息:

现在(2008 年 11 月 10 日)有一个 VS2010 的“社区技术预览”(CTP),其中包含 VC10 的预览,其中实现了 C++0x 的某些部分(请注意,VC10 不会包含完整的 C++0x即使在 VC10 发布时也实现了更改):

http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en

有关 VC10 CTP 中的新功能的一些详细信息:

如上文所述,“Microsoft Visual Studio 2010 年 9 月社区技术预览版 (CTP) 中的 Visual C++ 编译器包含对四种 C++0x 语言功能的支持,即:”

  • 拉姆达,
  • 汽车,
  • 静态断言,
  • 右值引用
于 2008-11-10T20:05:20.927 回答
3

Herb Sutter 是 ISO C++ 标准机构的主席,也为 Microsoft 工作。我不了解 Visual Studio C 标准——主要是因为我从不使用纯 C——但微软肯定会努力推动新的 C++ 标准向前发展。这方面的证据——就像提到的 OregonGhost 一样——包含在最新的 Visual Studio 服务版本中的 TR1。

于 2008-09-28T18:55:47.907 回答
3

Visual C++ 团队确实在http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language上发布了 2010 版支持的 C++0x 功能表-features-in-vc10-the-table.aspx。由于规范和实现之间可能存在滞后时间,这似乎很合理。维基百科有一篇关于规范的好文章。在我写这篇文章的时候它还没有完成。

于 2011-01-26T18:36:15.867 回答
1

Visual C++ Bloq 提供了很多关于在 VC++11 中支持 C++11 的几个有趣点的信息,包括几个表

  • C++11 核心语言特性
  • C++11 核心语言特性:并发
  • C++11 核心语言特性:C99
  • x86 容器大小(字节)
  • x64 容器大小(字节)

Visual C++ 团队博客,Visual C++ 11 中的 C++11 功能

于 2013-06-28T03:03:30.660 回答