Share via


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++ 標準的一部分,但它是由數個常見的編譯器可移植實作。

在相同的檔案中,使用 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 的多重包含優化。

另請參閱

Pragma 指示詞和 __pragma_Pragma 關鍵字