Visual Studio支持新的C / C ++标准?

我一直在阅读关于C99和C ++ 11以及所有这些非常可爱的东西,这些东西已经被添加到语言标准中,可能有一天会很好用。 然而,我们目前在Visual Studio中编写C ++的地方还是陷入困境。

标准中的任何新东西是否会被添加到Visual Studio中?或者,Microsoft是否更愿意添加新的C#变体来实现这一点?

编辑:除了接受的答案,我发现了Visual C ++团队的博客:

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

具体来说,这个post里面:

http://blogs.msdn.com/vcblog/archive/2008/02/22/tr1-slide-decks.aspx

很有用。 谢谢!

MS有一系列的公开回复,其中大多数是归咎于用户。 像这个:

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

现在,Visual C ++编译器团队偶尔会收到为什么我们没有实现C99的问题。 这确实是基于我们用户的兴趣。 我们收到了很多关于某些C99function的请求,我们试图实现它们(或类似function)。 几个例子是可变macros, long long__pragma__FUNCTION____restrict 。 如果还有其他的C99function,你会发现你的工作有用,让我们知道! 我们从C用户那里听不到什么,所以请大声说出来,让自己听到

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

嗨:不幸的是,我们从大多数用户那里得到的压倒性的反馈是,他们宁愿我们专注于C ++-0x而不是C-99。 我们已经“挑选了”一些受欢迎的C-99特性(可变macros, long long ),但是除此之外,我们不太可能在C-99空间(至less在短期内)做更多的事情。

乔纳森石窟

Visual C ++编译器团队。

这是一个相当悲哀的事情,但是如果你怀疑MS想要locking用户,这也是有意义的:这使得很难将现代的基于gcc的代码移植到MSVC中,至less我觉得非常痛苦。

尽pipe存在解决方法:请注意,英特尔对此更为开明。 英特尔C编译器可以处理C99代码,甚至与gcc具有相同的标志,使得在平台之间移植代码变得更加容易。 此外,英特尔编译器在Visual Studio中工作。 所以通过报废MS COMPILER,您仍然可以使用您认为具有某种价值的MS IDE,并将C99用于您的内容。

一个更明智的方法是诚实地转移到英特尔CC或gcc,并将Eclipse用于您的编程环境。 代码在Windows-Linux-Solaris-AIX等平台上的可移植性对我的经验来说通常很重要,而且不幸的是MS工具根本不支持这一点。

Herb Sutter既是C ++标准化协作组织的主席,也是非常活跃的成员,也是Visual Studio for Microsoft的软件架构师。

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

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

有他的名字。 所以我猜想只要H. Sutter留在微软,C ++ 0x的包含就能保证。

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

  • 最有趣的C99特性已经存在于C ++中(内联,任意variables声明,注释等),并且可能已经在Visual Studio C中使用(如果只在C ++编译器中执行C代码)。 在这里查看我的答案,获取关于C ++中C99特性的更完整的讨论。
  • C99增加了C和C ++之间的差异,通过添加已经存在于C ++中的function,但以不兼容的方式(抱歉,但C99中的布尔复杂实现是可笑的,至多…参见http://david.tribble.com/ text / cdiffs.htm获取更多信息)
  • 在Windows上的C社区似乎并不存在或不够重要的承认
  • Windows上的C ++社区似乎太重要了,不容忽视
  • .NET是微软希望人们在Windows上编程的方式。 这意味着C#,VB.NET,也许C ++ / CLI。

那么,我会不会是微软,为什么我要实现less数人将会使用的function,当大部分人已经使用的更多的社区活动语言已经提供了相同的function?

结论?

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

尚未实施的C99function将在未来几年内不会实现,除非发生了一些戏剧性的事情(一个充满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. 我们的主要目标是支持“大多数C99 / C11是ISO C ++ 98 / C ++ 11的子集”。
  2. 我们也出于历史原因运送一个C90编译器,它只接受C90而不接受C ++
  3. 我们不打算支持不属于C90或ISO C ++的ISO C特性。

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

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

从VC2013预览版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又名:STL是STL @VC团队的维护者):

具体来说,在2015年,我们的C99标准库实现已经完成,除了tgmath.h(在C ++中不相关)和CX_LIMITED_RANGE / FP_CONTRACT附注macros。

查看这篇文章的详细信息: http : //blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx 。

我参与了ISO C ++的工作(2000-2005),微软对这种语言做出了重大的贡献。 毫无疑问,他们将在C ++ 0x上工作,但他们比英特尔需要更多的时间。 Micosoft必须处理更大的代码库,这个代码库经常使用他们专有的扩展。 这只是一个更长的testing库。 然而,他们最终会支持大部分的C ++ 0x(尽pipe出口仍然不被人喜欢,或者我明白了)。

对于ISO C来说,从事标准工作的人并不代表微软市场。 微软的客户可以使用C ++ 98,如果他们只是在寻找一个更好的C.那么为什么微软会花钱在C99上呢? 当然,微软挑选的部分,但这是理智的业务。 无论如何,他们都需要C ++ 0x,那为什么要等呢?

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

我在x264上工作,与ffmpeg不同,它努力支持MSVC,虽然这样做往往是一个噩梦本身。 即使明确地通过基于显式的基于汇编的堆栈alignment函数来传递最高的函数调用,它也不会保持堆栈alignment,所以所有需要alignment堆栈的函数都必须被禁用。 它也非常烦人,我也不能使用vararrays; 也许这是最好的,因为显然GCC大大地performance了他们的performance。

MSVC 2010和2011版MSVC的C ++ 11function兼容性的最新post现在在线 。

Visual C ++ 2008 SP1至less包含TR1的一部分,Visual C ++团队不时会在博客或者C ++ 0x的讨论中,所以我想他们会在某个时候支持这个function。 我没有读过任何官方的东西。

更新了这方面的信息:

现在(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新增function的详细信息:

  • Visual Studio 2010 CTP发布
  • Lambdas,auto和static_assert:VC ++中的C ++ 0xfunction,第1部分

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

  • lambdaexpression式,
  • 汽车,
  • static_assert,
  • 右值引用

微软从来没有表示有兴趣跟上c99标准(现在正在变老)。 C程序员很伤心,但我怀疑微软更关心C ++社区。

Herb Sutter是ISO C ++标准组织的主席,同时也为微软工作。 我不了解Visual Studio C标准 – 主要是因为我从来不使用普通的C语言 – 但是Microsoft肯定会试图推动新的C ++标准。 这个证据就像OregonGhost提到的那样 – 包含在最新的Visual Studio Service Release中的TR1。

Visual C ++团队确实推出了2010版本支持的C ++ 0xfunction表: http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language -features-in-vc10-the-table.aspx 。 由于规范和实现之间可能会有一段时间的滞后,这似乎是相当合理的。 维基百科有一个关于规格的好文章。 我写这个的时候还没有完成。

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

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

Visual C ++团队博客,Visual C ++中的C ++ 11function11