簡體   English   中英

為什么在包括警衛之前放置#include

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

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