[英]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.