Pragma once

在C和C++程式語言中，#pragma once是一個非標準但是被廣泛支援的前置處理符號，會讓所在的檔案在一個單獨的編譯中只被包含一次。以此方式，#pragma once提供類似include防範的目的，但是擁有較少的程式碼且能避免名稱的碰撞。

 示例 
請參考include防範裡其中一種狀況的範例或其他的使用方法。如下：

grandparent.h
#pragma once

struct foo 
{
    int member;
};

parent.h
#include "grandparent.h"

child.c
#include "grandparent.h"
#include "parent.h"

 優缺點 
使用#pragma once代替include防範將加快編譯速度，因為這是一種高階的機制；編譯器會自動比對檔案名稱或inode而不需要在標頭檔去判斷#ifndef和#endif。

另一方面，部份編譯器，例如GCC、clang等，也包含特別的程式碼來識別和有效率的管理include防範。因此使用#pragma once并不会得到明显的加速。

此外，因為編譯器自己必須承擔管理#pragma once，它不必定義新的指令名稱，例如在include防範文章範例的H_GRANDFATHER。這能排除名稱碰撞的風險，意思就是至少第一次包含標頭檔不會再有錯誤。

然而，這種高階的管理有好也有壞；設計者必須依賴編譯器正確的管理#pragma once。編譯器如果犯錯，例如沒有辨認出在相同檔案中的兩個不同符號連結名稱指標，此時編譯會錯誤。編譯器對於#pragma once可能包含相關的bug LCC-Win32 2004年和GCC 1998年。2005年，GCC文件中將#pragma once列為「已淘汰」的特性。随着gcc 3.4的发布，gcc解决了#pragma once中的一些问题（主要是跟符号链接和硬链接有关），并且去掉了#pragma once的“已淘汰”的标签。

编译器支持

 Compiler #pragma once Clang  支持   支持 C++Builder XE Seattle  支持 Digital Mars C++  支持 GCC  支持（3.4版本以后） Intel C++編譯器  支持  Microsoft Visual C++  支持 Pelles C  支持IDE help/documentation IAR C/C++  支持 (2022年以後Supported but not yet documented (doc planned for spring 2022))TinyCC支持 (2015年以後)

 参考文献 

 外部連結 
 https://web.archive.org/web/20070317022009/http://msdn.microsoft.com/library/en-us/vclang/html/_PREDIR_Pragma_Directives.asp

Category:C語言
Category:C++
Category:C頭文件