once
pragma
指定編譯原始程式碼檔時,編譯程式只包含頭檔一次。
語法
#pragma once
備註
的使用 #pragma once
可減少建置時間,因為編譯程式不會在轉譯單元中的第一個 #include
檔案之後再次開啟並讀取檔案。 稱為多重包含優化。 其效果類似於 include guard 語,它會使用預處理器巨集定義來防止檔案內容的多個包含。 它也有助於防止違反 一個定義規則:所有範本、類型、函式和物件在您的程式代碼中都不超過一個定義的需求。
例如:
// header.h
#pragma once
// Code placed here is included only once per translation unit
對新程式碼我們建議 #pragma once
指示詞,因為它不會干擾全域命名空間與前置處理器符號。 它需要較少的輸入,它不太分散注意力,而且它不能造成 符號衝突。 當不同的頭檔使用與防護值相同的預處理器符號時,符號衝突是造成錯誤。 它不屬於 C++ Standard 的一部分,但它是由數個常見的編譯程式可移植實作。
在相同的檔案中,使用 include guard 語和 #pragma once
沒有好處。 編譯程式會辨識 include guard idiom,並且實作多重包含優化的方式與 #pragma once
指示詞相同,如果沒有非批注程式代碼或預處理器指示詞在成語的標準形式之前或之後:
// header.h
// Demonstration of the #include guard idiom.
// Note that the defined symbol can be arbitrary.
#ifndef HEADER_H_ // equivalently, #if !defined HEADER_H_
#define HEADER_H_
// Code placed here is included only once per translation unit
#endif // HEADER_H_
當程式代碼必須可移植到未實 #pragma once
作 指示詞的編譯程式、維護與現有程式代碼的一致性,或不可能進行多重包含優化時,建議使用 include 防護語。 當文件系統別名或別名 Include 路徑防止編譯程式依標準路徑識別相同的 Include 檔案時,就可能發生在複雜專案中。
請小心不要在頭檔中使用 #pragma once
或包含防護語意,其設計目的是要包含多次,使用預處理器符號來控制其效果。 如需此設計的範例,請參閱 <assert.h> 頭檔。 也請小心管理您的 Include 路徑,以避免建立多個路徑至包含的檔案,這可以擊敗包含防護和 #pragma once
的多重包含優化。