代码之家  ›  专栏  ›  技术社区  ›  onqtam

STL头文件是完全手工编写的吗?

  •  11
  • onqtam  · 技术社区  · 12 年前

    我正在查看编译器提供的各种STL头文件,我无法想象开发人员真的用手编写所有这些代码。 所有的宏以及变量和类的奇怪名称——他们必须记住所有这些!对我来说似乎容易出错。 标题的一部分是文本预处理或生成的结果吗?

    2 回复  |  直到 12 年前
        1
  •  37
  •   Stephan T. Lavavej    12 年前

    我已经维护了Visual Studio对C++标准库的实现7年(VC的STL是由Dinkumware的P.J.Plauger在90年代中期编写并获得许可的,我与PJP合作以获取新功能和维护错误修复),我可以告诉你,我的所有编辑都是在纯文本编辑器中“手动”完成的。STL的头文件或源文件都不是自动生成的(尽管Dinkumware的主源文件(我从未见过)经过自动过滤,以便为Microsoft生成定制的drop),而签入源代码管理的内容则直接发送给用户,无需任何进一步修改(现在,也就是说,之前我们对它们进行了一个过滤步骤,这导致了很多麻烦)。我因不使用IDEs/autocomplete而臭名昭著,尽管我确实使用SourceInsight浏览代码库(尤其是我不太熟悉的底层CRT),而且我广泛依赖grep。(当然,我使用diff工具;我最喜欢的是名为“odd”的内部工具。) 非常 仔细的剪切和粘贴编辑,但与新手的原因相反;当我完全理解代码的结构时,我会这样做,并且我希望准确地复制代码的一部分,而不会意外地遗漏一些内容。(例如,不同的容器需要非常相似的机器来处理分配器;它可能应该是集中的,但同时当我需要修复basic_string时,我将验证向量是否正确,然后复制它的机器。)我可能已经生成了两次代码——一次是在冲压出我设计的C++14透明运算符函子时(加<>、乘<>、更大<gt;等都是高度重复的),另一次是实现/提出类型特征的变量模板时(最近投票通过了库基础技术规范,可能是针对C++17的)。IIRC,我为运算符函子编写了一个实际的程序,而为变量模板使用了sed。我使用的纯文本编辑器(Metapad)具有搜索和替换功能,这些功能非常有用,尽管比直接正则表达式弱;如果我想复制文本块,我需要更强的工具(例如is_same_v=is_same<T>::value)。

    STL维护人员如何记住所有这些东西?这是一份全职工作。当然,我们也在不断地查阅标准/工作文件,了解所需的接口和代码行为。(我最近发现,我很难从内存中枚举所有50个美国州,但我肯定无法从内存中列举所有STL算法 最长的 名字,作为一个无用的琐事。:->)

        2
  •  6
  •   David Rodríguez - dribeas    12 年前

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

    它们很可能是手写的,正如其他人所提到的,如果你花一些时间看它们,你会发现编码约定是什么,变量是如何命名的等等 _ 后跟大写字母或 __ (两个连续的下划线),因此您将在标准标头中找到许多名称 _M_xxx 或 __yyy 一开始可能会很惊讶,但过了一段时间,你就忽略了前缀。。。