我正在查看编译器提供的各种STL头文件,我无法想象开发人员实际上是手工编写所有这些代码。 所有的宏和奇怪的变量和类的名称 - 他们必须记住所有这些!似乎容易发生错误。 标题的一部分是否由某些文本预处理或生成产生?
答案 0 :(得分: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算法。但是,我记住了最长的名称,作为一个无用的琐事。: - >)
答案 1 :(得分:6)
在某种意义上,它的外观设计为怪异。标准库及其中的代码需要避免与用户程序中使用的名称冲突,包括宏,并且对用户程序中的内容几乎没有限制。
它们很可能是手写的,正如其他人所提到的,如果你花一些时间查看它们,你会发现编码约定是什么,变量如何命名等等。少数限制之一包括用户代码不能使用以_
开头的标识符,后跟大写字母或__
(两个连续的下划线),因此您会在标准标题中找到许多看起来像{的名称{1}}或_M_xxx
一开始可能会出人意料,但过了一段时间后你就会忽略前缀......