本页使用了标题或全文手工转换

pragma once

维基百科,自由的百科全书
跳转至: 导航搜索

CC++程式語言中,#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

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

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

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

编译器支持[编辑]

Compiler #pragma once
Clang 支持[4]
Comeau C/C++ 支持[5]
C++Builder XE3 支持[6]
Digital Mars C++ 支持[7]
GCC 支持[8] ( 3.4版本以后[9]
Intel C++ Compiler 支持[10]
Microsoft Visual C++ 支持[11]
Pelles C 支持[12]
IAR C/C++ 支持[13]

参考资料[编辑]

  1. ^ The C Preprocessor: 1. The C Preprocessor. Gcc.gnu.org. 1996-02-01 [2013-08-19]. 
  2. ^ “Clang” CFE Internals Manual — Clang 3.4 documentation. Clang.llvm.org. [2013-08-19]. 
  3. ^ clang: File manipulation routines. Clang.llvm.org. [2013-08-19]. 
  4. ^ clang: clang: Pragma.cpp Source File. Clang.llvm.org. [2013-08-19]. 
  5. ^ Comeau C++ Pre-Release User Documentation: Pragmas. Comeaucomputing.com. [2013-08-19]. 
  6. ^ #pragma once - RAD Studio XE3. Docwiki.embarcadero.com. 2010-12-02 [2013-08-19]. 
  7. ^ Pragmas. Digital Mars. [2013-08-19]. 
  8. ^ Alternatives to Wrapper #ifndef. Gcc.gnu.org. [2013-08-20]. 
  9. ^ GCC 3.4 Release Series — Changes, New Features, and Fixes. Gcc.gnu.org. [2013-08-19]. 
  10. ^ Diagnostic 1782: #pragma once is obsolete. Use #ifndef guard instead.. Intel Developer Zones. [4 December 2013]. 
  11. ^ once (C/C++). Msdn.microsoft.com. [2013-08-19]. 
  12. ^ IDE help/documentation
  13. ^ IAR C/C++ Development Guide. IAR Systems. [4 December 2013]. 

外部連結[编辑]