我在研究STL的实现,我不明白代码是如何编译的。
以std::set
为例。Here's a reference to libstdc++ on github.。
在内部,std::set
使用一个红黑树,使用class _Rb_tree
,第131-133行。
看起来class _Rb_tree
在stl_tree. h中定义,可用here,第425行。
我很困惑,因为stl_set.h
不包含stl_tree.h
。为什么这不会失败?
我在研究STL的实现,我不明白代码是如何编译的。
以std::set
为例。Here's a reference to libstdc++ on github.。
在内部,std::set
使用一个红黑树,使用class _Rb_tree
,第131-133行。
看起来class _Rb_tree
在stl_tree. h中定义,可用here,第425行。
我很困惑,因为stl_set.h
不包含stl_tree.h
。为什么这不会失败?
2条答案
按热度按时间ff29svar1#
如果您查看实际公开并打算使用的头文件
<set>
,您可以看到stl_tree.h
包含在stl_set.h
之前,因此包含该主头文件的文件将编译而不会出现任何问题。w6mmgewl2#
它不会失败,因为您正在查看实现细节,并且您不应该直接包含
stl_set.h
。您确实包含了<set>
,它确实包含了这两个头文件。我想你会感到困惑,因为通常一个头包含它所使用的内容。这样就可以确保没有隐藏的依赖关系。包含一个头就足以使用它。
然而,这正是好的实践/惯例。没有什么(除了惯例)禁止你写这样的两个头文件:
要使用它们,必须以正确的顺序包括这两个方面:
当然,当其他代码应该包含头文件时,你不应该写这样的头文件。如果你在这样的情况下,你应该写一个第三个头文件:
现在,代码的用户可以包含
foobar.h
,而不必担心包含的顺序。