c++ 了解STL包含以及编译/预处理的工作原理

wn9m85ua  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(143)

我在研究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。为什么这不会失败?

ff29svar

ff29svar1#

如果您查看实际公开并打算使用的头文件<set>,您可以看到stl_tree.h包含在stl_set.h之前,因此包含该主头文件的文件将编译而不会出现任何问题。

w6mmgewl

w6mmgewl2#

它不会失败,因为您正在查看实现细节,并且您不应该直接包含stl_set.h。您确实包含了<set>,它确实包含了这两个头文件。
我想你会感到困惑,因为通常一个头包含它所使用的内容。这样就可以确保没有隐藏的依赖关系。包含一个头就足以使用它。
然而,这正是好的实践/惯例。没有什么(除了惯例)禁止你写这样的两个头文件:

  1. # foo.h
  2. struct foo { bar b; }
  3. # bar.h
  4. struct bar {};

要使用它们,必须以正确的顺序包括这两个方面:

  1. #include "bar.h"
  2. #include "foo.h"
  3. foo f; // works !!

当然,当其他代码应该包含头文件时,你不应该写这样的头文件。如果你在这样的情况下,你应该写一个第三个头文件:

  1. # foobar.h
  2. #include "bar.h"
  3. #include "foo.h"

现在,代码的用户可以包含foobar.h,而不必担心包含的顺序。

展开查看全部

相关问题