【问题标题】:Does C++11 support new features of C11?C++11 是否支持 C11 的新特性?
【发布时间】:2013-09-05 23:45:10
【问题描述】:

我最近在 C11 中进行了探索,许多新功能使我更容易在 C 中编写代码。我想知道 C++11 正式支持所有这些功能。我关心的不是实现或编译器问题,而是新的 C++ 标准。

【问题讨论】:

  • 一些,但它们是两种不同的语言。
  • 具体有哪些功能?一些新的 C 特性也是 C++ 中的特性(但不能保证,因为 @chris 说它们是独立的语言。)
  • 我熟悉 C++11 但不熟悉 C11:了解您的具体需求会有所帮助。此外,在某些领域,两种语言追求不同的方法,并且特性不会从 C 映射到 C++。
  • “许多”新功能到底是什么意思?
  • C++ 目前至少不支持 C99 可变长度数组。

标签: c++ c c++11 c11


【解决方案1】:

不,C++11 不支持 C11 的所有功能。它甚至不支持 C99 的所有功能。例如,可变长度数组是在 C99 中引入的,但 C++ 尚不支持它们。详情请见this question

【讨论】:

  • 可变长度数组适用于 C++14(只是为了给你的声明一个时间框架)。
  • @zneak:不,C++ 考虑的“运行时绑定数组”与 C 的 VLA 不同。
  • @BenVoigt, N3820 包括一个具有非常量 nint foo[n] 形式的示例。我应该注意哪些差异?不过,我发现它不再适用于 C++14。
  • @zneak:C++ 中的“运行时绑定数组”提案不允许作为sizeofdecltype 的参数。在 C99 中,sizeof 是在 VLA 上使用时的运行时操作。我听说还有其他不同之处,我不记得了。
【解决方案2】:

在主要的新增功能中,有两个在 C11 和 C++11 之间共享:线程和原子。我认为新的内存排序模型也在两者之间共享,但我对 C++11 的了解还不够,无法肯定地断言。

C11 的一个主要新增功能可能永远不会被 C++ 共享:使用_Generic 键入泛型表达式。对于它的许多用例,特别是函数重载,已经有 C++ 结构实现了它。 C++ 未涵盖其他更复杂的用例,例如检测编译时整数常量表达式。 C++1 有constexpr,但除了名称可能暗示这不是确定表达式是否为常量表达式的工具,而是指定对象或函数返回是常量。为这两种情况(常量和非常量)生成完全不同的代码似乎是不可能的。

不仅 C++ 中的主要用例不需要_Generic,它还严重依赖于预处理阶段的宏编程。由于宏被 C++ 社区的大部分人所反对,因此肯定不会达成共识。

【讨论】:

  • 投反对票。 C++11 可以使用constexpr 检测编译时常量表达式。
  • @TemplateRex,我将研究它与 C 功能的比较。在没有给我时间纠正的情况下对这样的事情投反对票,这似乎有点极端。你是不是那个在最后一天追我,并对我多年前给出的几个旧答案投反对票的人?
  • 不,我尝试总是发表评论,我通常会检查答案是否有更新,以便我可以撤回任何反对票。关于其他反对意见,我认为昨晚在 C++ 聊天休息室中,您在 this question 中编辑标签时让一些人感到不安,其中两个最高投票的答案(包括我的一个)也同时被反对(没有评论)。
  • @TemplateRex,好的,感谢您的通知。事实是,我也有点沮丧,这个问题被 C++ 社区“强制”提出。
  • 哦,顺便说一句,没有像 the C++ 社区这样的东西。正如 Stroustrup 所说:“没有人知道大多数 C++ 程序员在做什么”。事实上,甚至还有一个Boost.Preprocessor 库,铁杆模板元程序员最常使用它来完成工作。这不是一场意识形态战争,只是找到合适的工具。
【解决方案3】:

C++11 标准引用了 C99 标准,尤其是 C 标准库。

C++11 支持 C99 中的部分(但不是全部)功能,但 C90 中不支持。 (某些特定于 C99 的特性在 C++ 中得到不同的支持,或者被认为不合适。)

C11 在 C99 的基础上增加了许多功能;这些新功能中的大部分没有也被添加到 C++ 中。

一个值得注意的例外是线程支持(C11 中的<threads.h>,C++11 中的<thread>)。我还没有仔细研究过这个,不知道它们有多相似。

(C11 还提供了一些新特性,以及一些 C99 特性,可选;这也没有反映在 C++ 中。)

【讨论】:

  • 我的理解是C11增加了线程支持,无论是语言支持的形式,还是组件用来处理线程和同步原语的形式。我认为所有这些特性都是 C++,尽管 C 和 C++ 的规范不一定相同。
  • 还有很多其他的小东西,比如匿名结构、没有返回函数、一些类型的泛型表达式等等。而且,最重要的是,它终于摆脱了gets()
  • C11 添加了 C++11 线程支持(和原子),而不是相反;)
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 2018-10-17
  • 2013-10-15
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多