Visual Studio支持新的C / C++标准
Visual Studio support for new C / C++ standards?
我一直在阅读有关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/
非常有用。谢谢!
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领域做更多的事情(至少在短期内)。乔纳森洞穴
可视化C++编译器团队。
这是一个非常可悲的状态,但如果你怀疑MS想要锁定用户也是有道理的:这使得将现代基于gcc的代码移植到MSVC中变得非常困难,至少我觉得这非常痛苦。
但是,存在一种解决方法: 请注意,英特尔在这方面更加开明。 Intel C 编译器可以处理 C99 代码,甚至具有与 gcc 相同的标志,这使得在平台之间移植代码变得更加容易。 此外,英特尔编译器在Visual Studio中工作。 因此,通过废弃MS COMPILER,您仍然可以使用您似乎认为具有某种价值的MS IDE,并尽情使用C99。
更明智的方法是老实说,迁移到英特尔 CC 或 gcc,并将 Eclipse 用于您的编程环境。 根据我的经验,跨Windows-Linux-Solaris-AIX-etc的代码可移植性通常很重要,不幸的是,MS工具根本不支持这一点。
Herb Sutter既是标准化委员会的主席,也是C++非常活跃的成员,也是Visual Studio for Microsoft的软件架构师。
他是标准化C++0x的新C++记忆模型的作者之一。例如,以下论文:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2669.htmhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2197.pdf
上面有他的名字。所以我想只要H. Sutter还在Microsoft,就可以确保在Windows上包含C++0x。
至于C99只部分包含在Visual Studio中,我想这是一个优先级问题。
- 最有趣的 C99 功能已经存在于C++中(内联、任何地方的变量声明、//注释等),并且可能已经在 Visual Studio 的 C 中使用(如果只是在 C++ 编译器中执行 C 代码)。有关 C++ 中 C99 功能的更完整讨论,请参阅我的回答。
- C99 通过添加 C++ 中已经存在的功能来增加 C 和 C++ 之间的差异,但以不兼容的方式(抱歉,但 C99 中的
布尔复杂实现充其量是可笑的......有关详细信息,请参阅 http://david.tribble.com/text/cdiffs.htm) - Windows 上的 C 社区似乎不存在或不够重要,无法得到承认
- Windows 上的C++社区似乎太重要了,不容忽视
- .NET是Microsoft希望人们在Windows上编程的方式。这意味着 C#,VB.NET,也许是 C++/CLI。
那么,我会Microsoft,当大多数人已经在使用的更多社区活跃语言中提供了相同的功能时,为什么我会实现很少有人会使用的功能?
结论?
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)明确表示:
- 我们的主要目标是支持"大部分C99/C11,即ISO C++98/C++11的子集"。
- 出于历史原因,我们还发布了一个 C90 编译器,它(仅)接受 C90 而不是C++
- 我们不打算支持不属于 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 编译指示宏。
查看此帖子以获取详细信息:http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx。
我参与了ISO C++的工作(2000-2005),Microsoft为该语言做出了重大贡献。毫无疑问,他们将在C++0x上工作,但他们需要比英特尔更多的时间。Micosoft必须处理一个更大的代码库,该代码库通常使用其专有扩展。这只会使测试时间更长。然而,他们最终将支持C++0x的大部分(出口仍然不受欢迎,或者我理解)。
当涉及到ISO C时,从事标准工作的人并不代表微软的市场。微软的客户可以使用C++98,如果他们只是在寻找更好的C。那么Microsoft为什么要花钱购买C99呢?当然,Microsoft精心挑选的零件,但这是理智的事情。无论如何,他们都需要这些 C++0x,所以为什么要等待呢?
MSVC对C的支持非常缺乏。 它仅支持 C99 的部分,该部分是 C++ 的子集...这意味着,例如,在 MSVC 中编译 FFMPEG 或其 libav* 库在物理上是不可能的,因为它们使用许多 C99 功能,例如命名结构元素。 更糟糕的是,libavcodec 还需要一个保持堆栈对齐的编译器,而 MSVC 不需要。
我在x264上工作,与ffmpeg不同,x264确实努力支持MSVC,尽管这样做本身往往是一场噩梦。 即使您通过基于程序集的显式堆栈对齐函数显式传递最高函数调用,它也不会保持堆栈对齐,因此必须禁用所有需要对齐堆栈的函数。 我也很难使用变量;也许这是最好的,因为显然 GCC 在性能方面严重悲观了它们。
最近一篇关于 MSVC 的 C++11 功能兼容性的文章现已上线。
Microsoft从未对跟上C99标准(现在已经过时)表示任何真正的兴趣。C程序员很难过,但我怀疑Microsoft更关心C++社区。
C++ 2008 SP1 至少包含 TR1 的部分内容,并且 Visual C++ 团队不时在博客或谈论 C++0x,所以我想他们会在某个时候在功能中支持它。不过我没有读过任何官方的东西。
更新了有关此内容的信息:
现在(2008 年 11 月 10 日)VS2010 的"社区技术预览"(CTP),其中包含 VC10 的预览,其中实现了 C++0x 的某些部分(请注意,即使 VC10 发布,VC10 也不会实现完整的 C++0x 更改):
http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en
有关 VC10 CTP 新增功能的一些详细信息:
- Visual Studio 2010 CTP 发布
- Lambdas、auto 和 static_assert:VC10 中的 C++0x 功能,第 1 部分
如上一篇文章所述,"Microsoft Visual Studio 2010 九月社区技术预览版 (CTP) 中的 Visual C++ 编译器包含对四个 C++0x 语言功能的支持,即:"
- λ,
- 自动
- static_assert,
- 右值引用
Herb Sutter是ISO C++标准机构的主席,也为Microsoft工作。我不了解Visual Studio C标准 - 主要是因为我从不使用普通的C - 但Microsoft肯定会尝试推动新的C++标准向前发展。证据是 - 就像OregonGhost提到的 - 包含在最新的Visual Studio服务版本中的TR1。
Visual C++团队确实列出了 2010 年版本在 http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx 年支持的 C++0x 功能表。由于规范和实现之间可能存在滞后时间,这似乎是非常合理的。 维基百科有一篇关于规范的好文章。在我写这篇文章的时候,它还没有完成。
Bloq 提供了大量关于 VC++11 中支持 C++11 的几个交互点的信息,包括几个表
- C++11 核心语言功能
- C++11 核心语言功能:并发
- C++11 核心语言功能:C99
- x86 容器大小(字节)
- x64 容器大小(字节)
Visual C++ Team Blog,Visual C++ 11 中的 C++11
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 标准::变体的赋值运算符
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 并行标准::复制复杂性