STL标题是完全手工编写的吗?

onq*_*tam 11 c++ stl

我正在查看编译器提供的各种STL头文件,我无法想象开发人员实际上是手工编写所有这些代码.所有的宏和奇怪的变量和类的名称 - 他们必须记住所有这些!似乎容易发生错误.标题的一部分是否由某些文本预处理或生成产生?

Ste*_*vej 37

我已经将Visual Studio的C++标准库的实现维护了7年(VC的STL是由Dinkumware的PJ Plauger在90年代中期编写并获得许可,我与PJP一起工作以获取新功能和维护错误修正),我可以告诉你,我在纯文本编辑器中"手动"完成了所有编辑工作.STL的标头或源代码都不会自动生成(尽管Dinkumware的主要来源,我从未见过,为了为Microsoft生成自定义丢弃,会通过自动过滤),并且检查到源代码管理中的内容直接发送给用户任何进一步的修改(现在,就是;之前我们通过过滤步骤运行它们引起了很多麻烦).我因为不使用IDE /自动完成而臭名昭着,尽管我使用Source Insight来浏览代码库(特别是我不太熟悉的底层CRT),而且我非常依赖grep.(当然我使用diff工具;我最喜欢的是一个名为"odd"的内部工具.)我非常小心地进行剪切和粘贴编辑,但出于与新手相反的原因; 当我完全理解代码的结构时,我这样做,并且我希望完全复制它的一部分而不会意外地遗漏.(例如,不同的容器需要非常类似的机器来处理分配器;它应该是集中的,但在此期间,当我需要修复basic_string时,我将验证向量是否正确,然后复制其机器.)我已生成代码可能两次 - 一次在我设计的C++ 14透明运算符函数(加上<>,乘以<>,大于<>等是高度重复的)时,再次实现/提出类型特征的变量模板时(最近投入了图书馆基础技术规范,可能是为了C++ 17).IIRC,我为操作员编写了一个实际的程序,而我使用sed作为变量模板.我使用的纯文本编辑器(Metapad)具有搜索和替换功能,虽然弱于完全正则表达式,但它们非常有用; 如果我想复制文本块,我需要更强大的工具(例如is_same_v = is_same <T> :: value).

STL维护者如何记住所有这些东西?这是一份全职工作.当然,我们一直在咨询标准/工作文件,以了解所需的接口和代码行为.(我最近发现,我可以非常困难地从内存中枚举所有50个美国州,但我肯定无法从内存中枚举所有STL算法.但是,我记住了最长的名字,作为一个无用的琐事. : - >)


Dav*_*eas 6

从某种意义上说,它的外观设计得很奇怪.标准库和其中的代码需要避免与用户程序中使用的名称冲突,包括宏,并且对用户程序中的内容几乎没有限制.

它们很可能是手工编写的,正如其他人所提到的,如果你花一些时间查看它们,你将会弄清楚编码约定是什么,如何命名变量等等.少数限制之一包括用户代码不能使用_以大写字母开头的标识符或__(两个连续的下划线),因此您会发现标准标题中的许多名称看起来像_M_xxx或者一__yyy开始可能会令人惊讶,但在一些之后你只是忽略了前缀......