[英]Why Placing #include BEFORE include guards
是否有任何正當理由將#include指令放在頭文件中的包含保護之前:
#include "jsarray.h"
#include "jsanalyze.h"
#include "jscompartment.h"
#include "jsgcmark.h"
#include "jsinfer.h"
#include "jsprf.h"
#include "vm/GlobalObject.h"
#include "vm/Stack-inl.h"
#ifndef jsinferinlines_h___
#define jsinferinlines_h___
//main body mostly inline functions
#endif
請注意,此示例取自應由經驗豐富的程序員開發的真實高調開源項目 - Firefox 10中使用的Mozilla Spidermonkey開源Javascript引擎(最新版本中也存在相同的頭文件)。
在備受矚目的項目中,我預計其設計背后必須有一些正當理由。 在包含守衛之前有#include
的正當理由是什么? 它是一種適用於僅內聯函數頭文件的模式嗎? 另請注意,此頭文件(jsinferinlines.h)實際上是通過最后一個#include "vm/Stack-inl.h"
包含自身(此頭文件包含許多其他頭文件,其中一個實際上再次包含此jsinferinlines.h在包含守衛之前的指令,這對我來說更沒意義。
因為你希望這些標題包含他們自己的守衛,所以它並沒有什么區別。
另請注意,此頭文件(jsinferinlines.h)實際上是通過最后一個#include“vm / Stack-inl.h”包含自身(此頭文件包含許多其他頭文件,其中一個實際上再次包含此jsinferinlines.h在包含守衛之前的指令,這對我來說更沒意義。
它不會有任何不同,因為包含該文件時的工作流將是:
"vm/Stack-inl.h"
"vm/Stack-inl.h"
到最后#include "jsinferinlines.h"
(你的文件) jsinferinlines.h
(跳過所有以前的包含,因為包括警衛) #include "vm/Stack-inl.h"
#ifndef jsinferinlines_h___
開始處理 但總的來說,相互標頭遞歸是不好的,應該不惜一切代價避免。
當時SpiderMonkey標題中有很多包含周期,並且將標題保護放在頂部導致難以理解編譯錯誤 - 我懷疑將標題保護放在包含之下只是對清除包含的一個漸進步驟。
但是我無法告訴你導致它產生影響的包含的確切順序。
現在SM標題中不應該有任何包含循環,它們的樣式是通過Nicholas Nethercote編寫的python腳本強制執行的。 如果你今天看看jsinferinlines.h,你會看到標題后衛位於它所屬的頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.