C++11 是否支持 C11 的新功能?

Does C++11 support new features of C11?

本文关键字:新功能 C11 是否 支持 C++11      更新时间:2023-10-16

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

不,C++11 不支持 C11 的所有功能。它甚至不支持C99的所有功能。例如,C99 中引入了可变长度数组,但 C++ 尚不支持它们。有关详细信息,请参阅此问题。

在主要的新增功能中,C11和C++11之间共享两个:线程和原子学。我认为新的记忆排序模型也在两者之间共享,但我不太了解 C++11 来肯定地断言这一点。

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

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

C++11标准引用了C99标准,特别是C标准库。

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

C11在C99之上添加了许多功能;大多数新功能也没有添加到C++中。

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

(C11 还将其一些新功能以及一些 C99 功能设为可选;这也没有反映在C++中。