#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
并不会得到明显的加速。[1][2][3]
此外,因為編譯器自己必須承擔管理#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 | 支持[4] |
Comeau C/C++ | 支持[5] |
C++Builder XE Seattle | 支持[6] |
Digital Mars C++ | 支持[7] |
GCC | 支持[8](3.4版本以后[9]) |
Intel C++編譯器 | 支持[10] |
Microsoft Visual C++ | 支持[11] |
Pelles C | 支持[12] |
IAR C/C++ | 支持[13] (2022年以後[14]) |
TinyCC | 支持[15] (2015年以後) |
参考文献
- . Gcc.gnu.org. 1996-02-01 [2013-08-19]. (原始内容存档于2013-08-07).
- . Clang.llvm.org. [2013-08-19]. (原始内容存档于2013-08-06).
- . Clang.llvm.org. [2013-08-19]. (原始内容存档于2013-11-11).
- . Clang.llvm.org. [2013-08-19]. (原始内容存档于2014-04-04).
- . Comeaucomputing.com. [2013-08-19]. (原始内容存档于2013-12-11).
- . Docwiki.embarcadero.com. 2015-08-25 [2016-03-10]. (原始内容存档于2016-03-10).
- . Digital Mars. [2013-08-19]. (原始内容存档于2013-12-12).
- . Gcc.gnu.org. [2013-08-20]. (原始内容存档于2016-03-04).
- . Gcc.gnu.org. [2013-08-19]. (原始内容存档于2013-08-07).
- . Intel Developer Zones. [4 December 2013]. (原始内容存档于2013-12-11).
- . Msdn.microsoft.com. [2013-08-19]. (原始内容存档于2016-08-10).
- IDE help/documentation
- (PDF). IAR Systems. [4 December 2013]. (原始内容 (PDF)存档于2017年5月16日).
- Supported but not yet documented (doc planned for spring 2022)
- . [19 June 2018]. (原始内容存档于2021-12-07).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.