如何(以及谁可以)实现C++委员会定义的标准库功能
How to (and who can) implement the standard library features defined by the C++ committee?
当C++委员会发布一个新功能,该功能将成为该语言下一个标准的标准库的一部分时,他们是否也会发布一些源代码或有关如何实现该功能的某种指南?
让我们以unique_ptr
为例。语言委员会只是为该类模板定义一个接口,并让编译器供应商随心所欲地实现它?标准库功能的实现过程究竟是如何发生的?
任何人都可以为尚不支持它们的平台实现标准库的某些部分吗?假设我想实现C++标准库的一些很酷的功能,以便在微控制器环境中使用它。我该怎么做?我应该在哪里查找信息?如果我决定开源我的项目,我可以这样做吗?我是否需要完全遵循标准规定,或者我可以编写不合规的版本?
通常,
-
每个新的库功能都会经过一个提案。
-
如果该提案进入C++委员会的图书馆发展工作组,它将经历一系列迭代(据我所知,这是一个"艰难的基础")。
-
它经历了一系列的细化过程,如下所述
-
如果它需要 (TS) 技术规范(自 C++11 起),它就会去那里烘烤。例如,
#include <filesystem>
在 C++17 之前位于文件系统 TS中。 -
我相信委员会喜欢的一件事是实施经验。
-
更多信息可以在ISOCpp网站上找到
好吧,关于实现:
-
有相当多的"库功能"不能纯粹作为库实现。 它们需要编译器支持。在这些情况下,编译器提供了您可以挂钩的"内在"。例如,clang 为某些type_traits提供内在
-
大多数库功能都有一些实现经验,主要来自 Boost 库。
-
您实际上可以查看编译器附带的默认标准库的源代码:
- libc++ for Clang
- libstdc++ for GCC
-
可悲的是,大多数实现都使用一大堆下划线。主要是因为它们保留供"标准库"使用。
任何人都可以为尚不支持它的平台实现标准库的一部分吗?
是的,您可以,到目前为止,您的编译器支持该平台,并且该平台或操作系统提供了可用的 API。例如。std::cout
,std::ifstream
元素等等都需要特定于平台的支持。
假设我想实现C++标准库的一些很酷的功能,以便在微控制器环境中使用它。我该怎么做?
您可以查看其他人的代码并从那里开始。我们向巨人学习。一些开源示例:
- 电子离
- 标准CPlusPlus
- uClib++
我该怎么做?我应该在哪里查找信息?
-
您可以在C++库中查看引入该功能的论文。例如,
std::optional
在这里有一个独立的实现,在提案阶段用作参考实现。 -
你可以检查标准库,做一个费力的研究。
- 搜索互联网。
- 或者按照标准的规定从头开始编写
我是否需要完全遵循标准规定,或者我可以编写不合规的版本?
没有强制遵循C++标准库指定的内容。那将是你"自己的"图书馆。
正式地说,没有。与所有标准一样,C++标准设定规则,而不是实施。但是,从实际的角度来看,如果没有建议的实现,几乎不可能将新功能引入标准库,因此您经常可以找到建议附带的功能。
至于你关于"你能写出不合规的版本吗"的问题,你可以为所欲为。采用可能取决于您的合规性,也可能不 - 众所周知,超级广泛采用的 MSVC 违反了C++标准。
通常,新功能不是标准化的,除非委员会有一些确凿的证据证明它可以实现并且会很有用。 这通常包括 boost 中的原型实现、GNU 库或商业编译器供应商之一。
标准本身不包含任何实施指南 - 它纯粹是一个规范。 编译器供应商(或其分包商)选择如何实现该规范。
在unique_ptr
的特定情况下,它从boost::unique_ptr
被采用到标准中 - 您仍然可以使用后者。 如果你有一个编译器可以为你的微控制器编译,几乎可以肯定它将能够构建足够的提升来使unique_ptr
工作。
没有什么能阻止你编写一个不合规的实现(除了一个微不足道的点,如果你把它卖为符合标准,而事实并非如此,你可能会得到你当地的等价物贸易标准来敲门。
委员会不发布任何参考实现。在早期,事情变得标准化,然后工具开发人员离开并实施标准。这种情况已经改变,现在委员会寻找在标准化之前已经实现和测试的功能。
此外,重大发展通常不会直接进入标准。首先,它们成为称为技术规范或TS的实验性功能。然后,这些TS可以在以后纳入主标准。
您可以自由编写自己的C++标准库实现。梅花堂有一个测试套件(商业,我没有联系,但梅花堂非常参与C++标准化)。
我认为不合规没有任何问题。几乎所有的实现都有一些扩展。只是不要做出任何虚假声明,特别是如果您想销售您的产品。
如果您有兴趣参与,可以通过您的"国家机构"(美国的ANSI,英国的BSI等)来完成。isocpp网站有一个关于标准化的部分,这将是一个很好的起点。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 如何(以及谁可以)实现C++委员会定义的标准库功能
- clang不起作用.未定义的符号错误.代码在海湾合作委员会中罚款
- 海湾合作委员会多重定义..仅释放