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


102

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

该标准中的任何新内容是否都会添加到Visual Studio中,或者Microsoft是否对添加新的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/

很有用。谢谢!


3
我不明白您在vcblog的2008/02文章中发现了什么有用,因为其中描述的功能早已存在于boost中并且众所周知。C ++ 0x的改变世界的功能是不同的:en.wikipedia.org/wiki/C%2B%2B0x列出了lambda函数,初始化程序等。
阿米特

blogs.msdn.com/vcblog/archive/2009/04/22/...最近的文章太(我知道这是后来当有人问这个问题比)
阿米特

1
这在Visual Studio的最新版本(例如2015 Update 2)中得到了极大的改进:visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres

考虑尝试使用MinGW-64
Basile Starynkevitch,

Answers:


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工具完全不支持。


42
不过,我想他们的真正原因正是他们所说的:Windows上的C社区与C ++ / C#/。NET / ASP社区相比可能几乎不存在,或者可以忽略不计。因此,他们有一个正确的观点。尽管我有一个Linux,并且像g ++一样,我不会仅仅因为C99而放弃MSVC ++。
paercebal

11
如果他们至少会给我们(int i ;;)和内联。
尼克·范·布伦特

12
回复:“锁定” vs gcc:永远不要将恶意归咎于不称职。
mskfisher

2
他们关于面向C ++ 0x的开发的最好回答是,现在,四年多了,他们仍然几乎没有C ++ 11支持。(同时gcc支持几乎所有内容。)
GManNickG'2

10
FWIW,VC2013预览版现在支持C ++ 11和C99标准。查看C / C ++开发人员的新增功能
vulcan raven

37

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

他是针对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中的布尔型复杂实现可笑,充其量是最好的。请参阅http://david.tribble.com/文字/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明确指出:

  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/


1
公平地说-C99中的布尔实现是为了与同等代码(即定义bool为布尔型的代码)向后兼容而完成的。
Maciej Piechotka 2011年

19
这:“大多数有趣的C99功能已经存在于C ++中”只是错误的。十六进制浮点格式程序和文字。C99数学库功能。命名为结构体/联合的初始化器。该restrict关键字。C ++缺少大量的C99很棒的功能,这些都是我每天作为C程序员使用的功能。
斯蒂芬·佳能

1
@斯蒂芬·佳能(Stephen Canon):请阅读我的回答:stackoverflow.com/questions/3879636/…。当然,这是C ++开发人员的C ++答案,因此它不适合不愿意使用类,构造函数或重载数学函数(在C ++中需要tgmath.h?)的C开发人员。关键是:重要的事情已经存在或易于实现。至于restrict关键字,显然您仍然可以在C ++中使用:stackoverflow.com/questions/776283/…。。。
paercebal 2011年

5
@paercebal:您有权使用该观点,但是C ++中没有什么可以吸引我放弃十六进制浮点文字的。这正是我的观点。 当然, C ++程序员并不关心C99功能。这可能就是为什么他们是C ++程序员。相反,有很多C程序员根本不关心C ++功能,只是希望Microsoft提供一个C编译器,该编译器至少要像其他人一样遵守该标准。
斯蒂芬·佳能

13
@paercebal:“等价物”没有用。有数百万行可移植C代码在其他平台上都能正常工作。您是否建议将其重写?C99的用户群体足够大,使得每一个其他主要编译器厂商至少尝试传送兼容性:IBM,HP,苹果,英特尔,GNU,太阳,ARM,无数的嵌入式设备编译器等,C99可能不是重要的Windows程序员,但是Windows程序只占编写的全部代码的一小部分。
斯蒂芬·佳能

11

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 aka:STL是STL @VC团队的维护者):

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

查阅此帖子以了解详细信息:http : //blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx


据我所知,仅部分支持C99:blogs.msdn.com/b/vcblog/archive/2013/07/19/… “ ...我们知道,这并不完全支持C99库功能。”
sdfqwerqaz1 2015年

@ sdfqwerqaz1,看到STL评论这里。编译器”和存储库团队会考虑他们对案件逐案的基础上,但我们的首要任务是C ++的一致性例如,由于C ++ 11月14日纳入C99标准通过引用的库,2015 Preview完全支持C99标准库(唯一的遗漏是tgmath.h,它需要C编译器魔术并且与具有重载的C ++不相关,而CX_LIMITED_RANGE / FP_CONTRACT也需要编译器支持)”
vulcan raven

8

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

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


7

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

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



4

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


4

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


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语言功能的支持:”

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

3

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.