簡體   English   中英

了解 STL 包括以及編譯/預處理的工作原理

[英]Understanding STL includes and how the compilation/preprocessing works

我正在調查 STL 實現,但我無法理解代碼是如何編譯的。

std::set為例。 這里引用 github 上的 libstdc++。。

在內部, std::set使用紅黑樹,使用class _Rb_tree ,第 131-133 行。

看起來class _Rb_tree在 stl_tree.h 中定義,可在此處獲取,第 425 行。

我很困惑,因為stl_set.h不包括stl_tree.h 為什么這不會失敗?

如果您查看實際公開並打算使用的 header <set> ,您可以看到stl_tree.h包含在stl_set.h之前,因此包含主要 header 的文件將毫無問題地編譯。

它不會失敗,因為您正在查看實現細節並且您不應該直接包含stl_set.h 您確實包含了<set> ,其中確實包含了這兩個標頭。

我想您很困惑,因為通常 header 包含它使用的內容。 這樣就可以確保沒有隱藏的依賴關系。 加上那個header就夠用了。

然而,這正是好的做法/慣例。 沒有什么(但約定)禁止你寫這樣的兩個標題:

# foo.h
struct foo { bar b; }

# bar.h
struct bar {};

要使用它們,必須以正確的順序包括兩者:

#include "bar.h"
#include "foo.h"

foo f;  // works !!

當然,當頭文件應該包含在其他代碼中時,您不應該這樣編寫頭文件。 如果你遇到這種情況,那么你應該寫第三個 header:

# foobar.h
#include "bar.h"
#include "foo.h"

現在您的代碼的用戶可以包含foobar.h而不必擔心包含的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM