簡體   English   中英

多次#included 保護的 header 文件將如何在不同的翻譯單元內?

[英]How a multiple times #included guarded header file will be inside different translation units?

我知道#inclusion 通常被描述為文本復制粘貼預處理器指令。 現在,如果 header 被 #include 保護或 #pragma 一次,那么我們如何描述經過第一個翻譯單元到 #include 所說的 header 之后實際發生的事情?

沒有“第一個”翻譯單元。 所有翻譯單元在概念上都是並行翻譯的(當然,在實踐中,您最終可能一次編譯一個,但這沒關系)。

每個翻譯單元都以一張白板開始。 從技術上講,這並不完全正確,因為您可以在命令行中添加#define s,並且還有一些預定義的宏,但無論如何,沒有翻譯單元會“記憶”在任何其他翻譯中執行的#define s單元。 因此,盡管有警衛,但 header 可能會多次#include d。 只是它不會將#include d 多次放入單個翻譯單元中。

這意味着您仍然必須注意避免多個定義:例如,如果您的 header 包含一個全局變量,那么您必須確保它是const (因此它將具有內部鏈接)或顯式聲明它inline (將所有定義折疊成一個) 或extern (以抑制 header 中的定義,以便您可以將定義放入單個翻譯單元中)。

盡管包含守衛並不能防止跨多個翻譯單元的多個定義,但它們確實可以防止單個翻譯單元內的多個定義,這很重要,因為即使某些實體可能在程序中定義多次,它仍然是不允許的多個定義出現在同一個翻譯單元中。 例如,如果您在 header 中有一個inline全局變量,則多個翻譯單元可以包含該 header,並且這些定義將在鏈接時全部折疊為一個定義,但如果任何一個翻譯單元定義該變量多次。 因此,這樣的 header 必須具有包含防護。

暫無
暫無

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

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