繁体   English   中英

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

[英]Are STL headers written entirely by hand?

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

我已经将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算法。但是,我记住了最长的名字,作为一个无用的琐事。 : - >)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM