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

时间:2020-03-06 14:50:58  来源:igfitidea点击:

我一直在阅读有关C99和C ++ 11以及所有这些非常甜美的东西,这些东西已经添加到语言标准中,有一天可能会很好用。但是,我们目前在用Visual Studio编写C ++的领域中感到苦恼。

标准中的任何新内容都会添加到Visual Studio中,还是Microsoft对添加新的Cvariant感兴趣呢?

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

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

具体来说,其中的帖子:

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

很有用。谢谢!

解决方案

微软从未表示过对保持c99标准(现在已经过时)保持真正兴趣的真正兴趣。对于C程序员来说很可悲,但是我怀疑Microsoft对C ++社区的关心更大。

Visual C ++ 2008 SP1至少包含TR1的各个部分,Visual C ++团队有时会在博客中谈论C ++ 0x,所以我想他们会在该功能的某些时候支持它。我什么都没读。

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

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

Now, the Visual C++ compiler team receives the occasionally question as to why we haven’t implemented C99.  It’s really based on interest from our users.  Where we’ve received many requests for certain C99 features, we’ve tried to implement them (or analogues).  A couple examples are variadic macros, long long, __pragma, __FUNCTION__, and __restrict.  If there are other C99 features that you’d find useful in your work, let us know!  We don’t hear much from our C users, so speak up and make yourselves heard

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

Hi: unfortunately the overwhelming feadback we get from the majority of our users is that they would prefer that we focus on C++-0x instead of on C-99. We have "cherry-picked" certain popular C-99 features (variadic macros, long long) but beyond this we are unlikely to do much more in the C-99 space (at least in the short-term).
  
  Jonathan Caves
  
  Visual C++ Compiler Team.

这是一种非常令人伤心的状态,但是如果我们怀疑MS想要锁定用户,那也是有道理的:这使得将基于gcc的现代代码移植到MSVC变得非常困难,至少我感到非常痛苦。

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

老实说,更明智的方法是移至Intel CC或者gcc,并在编程环境中使用Eclipse。以我的经验,跨Windows-Linux-Solaris-AIX-etc的代码可移植性通常很重要,不幸的是,MS工具完全不支持。

Herb Sutter是ISO C ++标准组织的主席,也为Microsoft工作。我不了解Visual Studio C标准,主要是因为我从未使用过普通的C语言,但是Microsoft确信一定会努力推动新的C ++标准的发展。这样的证据就像OregonGhost提到了最新的Visual Studio Service Release中包含的TR1.

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留在Microsoft,就可以确保Windows中包含C ++ 0x。

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

  • 大多数有趣的C99功能已经存在于C ++中(内联,变量声明在任何地方,//注释等),并且可能已经在Visual Studio的C语言中可用(如果仅在C ++编译器中执行C代码)。请在这里查看我的答案,以获取有关C ++中C99功能的更完整讨论。
  • C99通过添加C ++中已经存在的功能,但以不兼容的方式增加了C和C ++之间的差异(很抱歉,C99中的布尔型复杂实现可笑,充其量是最好的。 text / cdiffs.htm了解更多信息)
  • Windows上的C社区似乎不存在或者不够重要,无法得到认可
  • Windows上的C ++社区似乎太重要了,不容忽视
  • .NET是Microsoft希望人们在Windows上进行编程的方式。这意味着C#,VB.NET,也许是C ++ / CLI。

因此,如果我是Microsoft,当大多数人已经使用的社区活动语言已经提供了相同的功能时,为什么我要实现很少有人会使用的功能?

总结?

作为VS 2008的扩展,将包含C ++ 0x,或者包含在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)明确指出:

Our primary goal is to support "most of C99/C11 that is a subset of ISO C++98/C++11."
  We also for historical reasons ship a C90 compiler which accepts (only) C90 and not C++
  We do not plan to support ISO C features that are not part of either C90 or ISO C++.

博客文章中添加了链接以及这些决定的进一步说明。

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

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

我使用的是x264,与ffmpeg不同的是,x264确实在努力支持MSVC,尽管这样做本身一直都是噩梦。即使我们通过基于显式程序集的显式堆栈对齐函数显式传递最高函数调用,它也不会保持堆栈对齐,因此必须禁用所有需要对齐堆栈的函数。我也不能使用vararrays也很烦人。也许这是最好的,因为显然GCC严重地降低了它们的性能。

我参与了ISO C ++工作(2000-2005年),并且Microsoft为该语言做出了重大贡献。毫无疑问,它们将在C ++ 0x上运行,但是比起Intel,他们需要更多的时间。 Micosoft必须处理通常使用其专有扩展的较大代码库。这只会导致更长的测试阶段。但是,它们最终将支持大多数C ++ 0x(尽管仍然不喜欢导出,所以据我所知)。

当涉及到ISO C时,从事标准工作的人员并不能代表Microsoft市场。如果Microsoft的客户只是想寻找更好的C语言,他们可以使用C ++ 98. 那么,为什么Microsoft会花钱购买C99?当然,微软挑剔的零件,但这是理智的事情。无论如何,他们仍然需要C ++ 0x,所以为什么要等待?

有关此的更新信息:

现在(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新增功能的一些详细信息:

  • Visual Studio 2010 CTP发布
  • Lambda,自动和static_assert:VC10中的C ++ 0x特性,第1部分

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

  • lambdas,
  • 汽车,
  • static_assert,
  • 右值引用