Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL标题完全是手工编写的吗?_C++_Stl - Fatal编程技术网

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

C++ STL标题完全是手工编写的吗?,c++,stl,C++,Stl,我正在查看编译器提供的各种STL头,我无法想象开发人员实际上是手工编写所有这些代码的。 所有的宏以及变量和类的奇怪名称——他们必须记住所有这些!我似乎很容易犯错误。 标题的某些部分是文本预处理或生成的结果吗?从某种意义上说,标题的外观设计得很怪异。其中的标准库和代码需要避免与用户程序(包括宏)中使用的名称发生冲突,并且对于用户程序中可以包含的内容几乎没有任何限制 它们很可能是手工编写的,正如其他人所提到的,如果您花一些时间查看它们,您将了解编码约定是什么,变量如何命名等等。为数不多的限制之一包括

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

从某种意义上说,标题的外观设计得很怪异。其中的标准库和代码需要避免与用户程序(包括宏)中使用的名称发生冲突,并且对于用户程序中可以包含的内容几乎没有任何限制


它们很可能是手工编写的,正如其他人所提到的,如果您花一些时间查看它们,您将了解编码约定是什么,变量如何命名等等。为数不多的限制之一包括,用户代码不能使用以
开头,后跟大写字母或
(两个连续下划线)的标识符,因此您会在标准标题中发现许多名称看起来像
\u M\u xxx
\u yyy
,一开始可能会感到惊讶,但过了一段时间,你忽略了前缀……< /P> < P>我已经维护Visual Studio对C++标准库的实施7年(VC的STL是由90年代中期P.J.普劳格的PJ J Pulujg编写并授权的,我与PJP一起工作以获取新的特性和维护错误),我可以告诉你,我所有的编辑都是在纯文本编辑器中“手工”完成的。STL的头或源代码都不会自动生成(尽管我从未见过的Dinkumware的主源代码会经过自动过滤,以便为Microsoft生成定制的Drop),并且签入源代码管理的内容会直接发送给用户,无需进一步修改(现在,也就是说,之前我们对它们进行了一个过滤步骤,这导致了很多麻烦)。我因不使用IDE/autocomplete而臭名昭著,尽管我确实使用Source Insight来浏览代码库(尤其是我不太熟悉的底层CRT),而且我广泛地依赖于grep。(当然,我使用diff工具;我最喜欢的是一个名为“odd”的内部工具。)我确实非常仔细地进行剪切和粘贴编辑,但作为新手的原因正好相反;当我完全理解代码的结构时,我会这样做,我希望准确地复制部分代码,而不会意外地遗漏某些内容。(例如,不同的容器需要非常相似的机制来处理分配器;它可能应该是集中式的,但与此同时,当我需要修复基本_字符串时,我将验证vector是否正确,然后复制它的机制。)我可能已经生成了两次代码——一次是在消除我设计的C++14透明运算符函子时生成的(加号、乘法、加号等是高度重复的),另一次是在实现/提出类型特征的变量模板时生成的(最近被选入库基础技术规范,可能是针对C++17的).IIRC,我为运算符函子编写了一个实际的程序,而我为变量模板使用了sed。我使用的纯文本编辑器(Metapad)具有非常有用的搜索和替换功能,尽管比完全正则表达式弱;如果我想复制文本块(例如is_same_v=is_same::value),我需要更强大的工具


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

你能举一个你找到的例子吗?大多数情况下,标题都是手工编写的。可能会有一些代码生成,但大部分都是由预处理器完成的。如果你做了大量的编码,这将变得很容易。:p他们是手工编写的,你还希望如何编写?标题不是一次编写所有内容,在编写之前就知道所有内容。这是一个过程,根据需要添加功能,调整、改进、修复错误。这是一个漫长的过程。坦率地说,如果你认为STL头不好,你还没有看到任何东西。STL头通常管理得很好,从我所看到的情况来看,可以设计得很好。我们知道如果你在大多数VisualStudio STL头的末尾处看,你会发现大部分都是由HP完成的,版权日期为1994。有一个委员会决定C++中应该包含什么。没有AutoRealth.th.nthx用于这个令人敬畏的答案,保持好的工作!最长的名称:<代码> StIsSuffMeimCICIOL< < /代码>。@ TePraceReX <代码> STD::HyrWorkSuthIdapeIdapsixIs< /Cord>?C标准,我猜C++是基于这个40年的决定。是一个下划线足够了(资本还是小写字母)使它成为运行时定义的符号,而2个下划线保留给编译器定义的符号。@洛塔尔:答案中的规则直接来自C++标准。还有其他限制(<代码> x x <代码>也被保留在全局命名空间中),这不适用于这个问题。