<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Pragma_once</id>
	<title>Pragma once - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Pragma_once"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Pragma_once&amp;action=history"/>
	<updated>2026-07-20T05:12:15Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Pragma_once&amp;diff=248753&amp;oldid=prev</id>
		<title>imported&gt;InternetArchiveBot：​补救1个来源，并将0个来源标记为失效。) #IABot (v2.0.9.3</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Pragma_once&amp;diff=248753&amp;oldid=prev"/>
		<updated>2023-01-22T10:27:55Z</updated>

		<summary type="html">&lt;p&gt;补救1个来源，并将0个来源标记为失效。) #IABot (v2.0.9.3&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:&amp;amp;#35;pragma once}}&lt;br /&gt;
{{NoteTA|G1=IT}}&lt;br /&gt;
在[[C語言|C]]和[[C++]]程式語言中，&amp;#039;&amp;#039;&amp;#039;#pragma once&amp;#039;&amp;#039;&amp;#039;是一個非標準但是被廣泛支援的[[前置處理]]符號，會讓所在的檔案在一個單獨的編譯中只被包含一次。以此方式，&amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;提供類似[[include防範]]的目的，但是擁有較少的程式碼且能避免名稱的碰撞。&lt;br /&gt;
&lt;br /&gt;
== 示例 ==&lt;br /&gt;
請參考[[include防範]]裡其中一種狀況的範例或其他的使用方法。如下：&lt;br /&gt;
&lt;br /&gt;
;grandparent.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#pragma once&lt;br /&gt;
&lt;br /&gt;
struct foo &lt;br /&gt;
{&lt;br /&gt;
    int member;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;parent.h&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;grandparent.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;child.c&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;grandparent.h&amp;quot;&lt;br /&gt;
#include &amp;quot;parent.h&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 優缺點 ==&lt;br /&gt;
使用&amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;代替include防範將加快編譯速度，因為這是一種高階的機制；[[編譯器]]會自動比對檔案名稱或[[inode]]而不需要在[[標頭檔]]去判斷&amp;lt;code&amp;gt;#ifndef&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;#endif&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
另一方面，部份編譯器，例如[[GCC]]、[[clang]]等，也包含特別的程式碼來識別和有效率的管理include防範。因此使用&amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;并不会得到明显的加速。&amp;lt;ref&amp;gt;{{cite web |url=http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC8 |title=The C Preprocessor: 1. The C Preprocessor |publisher=Gcc.gnu.org |date=1996-02-01 |accessdate=2013-08-19 |archive-date=2013-08-07 |archive-url=https://web.archive.org/web/20130807225104/http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC8 |dead-url=no }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=http://clang.llvm.org/docs/InternalsManual.html#multipleincludeopt |title=“Clang”CFE Internals Manual—Clang 3.4 documentation |publisher=Clang.llvm.org |date= |accessdate=2013-08-19 |archive-date=2013-08-06 |archive-url=https://web.archive.org/web/20130806185452/http://clang.llvm.org/docs/InternalsManual.html#multipleincludeopt |dead-url=no }}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=http://clang.llvm.org/doxygen/group__CINDEX__FILES.html#ga1969fe907a40d9469ea68c370d0f602a |title=clang: File manipulation routines |publisher=Clang.llvm.org |date= |accessdate=2013-08-19 |archive-date=2013-11-11 |archive-url=https://web.archive.org/web/20131111172201/http://clang.llvm.org/doxygen/group__CINDEX__FILES.html#ga1969fe907a40d9469ea68c370d0f602a |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此外，因為編譯器自己必須承擔管理&amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;，它不必定義新的指令名稱，例如在[[include防範]]文章範例的&amp;lt;code&amp;gt;H_GRANDFATHER&amp;lt;/code&amp;gt;。這能排除名稱碰撞的風險，意思就是至少第一次包含標頭檔不會再有&amp;#039;&amp;#039;&amp;#039;錯誤&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
然而，這種高階的管理有好也有壞；設計者必須依賴編譯器正確的管理&amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;。編譯器如果犯錯，例如沒有辨認出在相同檔案中的兩個不同[[符號連結]]名稱指標，此時編譯會錯誤。編譯器對於&amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;可能包含相關的bug [[LCC-Win32]] 2004年[http://groups.google.com/groups?selm=bvjqhn$q5o$1@news-reader1.wanadoo.fr][http://groups.google.com/groups?selm=488cbfe1.0304061213.264d94d@posting.google.com]和GCC 1998年。[http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC8]{{Wayback|url=http://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC8 |date=20070425203334 }}2005年，GCC文件中將&amp;lt;code&amp;gt;#pragma once&amp;lt;/code&amp;gt;列為「已淘汰」的特性。[http://gcc.gnu.org/onlinedocs/gcc-4.0.3/cpp/Obsolete-once_002donly-headers.html#Obsolete-once_002donly-headers]{{Wayback|url=http://gcc.gnu.org/onlinedocs/gcc-4.0.3/cpp/Obsolete-once_002donly-headers.html#Obsolete-once_002donly-headers |date=20070102011354 }}随着gcc 3.4的发布，gcc解决了#pragma once中的一些问题（主要是跟符号链接和硬链接有关），并且去掉了#pragma once的“已淘汰”的标签。[http://gcc.gnu.org/gcc-3.4/changes.html]{{Wayback|url=http://gcc.gnu.org/gcc-3.4/changes.html |date=20100710060842 }}&lt;br /&gt;
&lt;br /&gt;
==编译器支持==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Compiler&lt;br /&gt;
! #pragma once&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| [[Clang]] || 支持&amp;lt;ref&amp;gt;{{cite web |url=http://clang.llvm.org/doxygen/Pragma_8cpp-source.html#l00184 |title=clang: clang: Pragma.cpp Source File |publisher=Clang.llvm.org |date= |accessdate=2013-08-19 |deadurl=yes |archiveurl=https://web.archive.org/web/20140404052351/http://clang.llvm.org/doxygen/Pragma_8cpp-source.html#l00184 |archivedate=2014-04-04 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| {{Translink|en|Comeau C/C++}} || 支持&amp;lt;ref&amp;gt;{{cite web |url=http://www.comeaucomputing.com/4.0/docs/userman/pragma.html |title=Comeau C++ Pre-Release User Documentation: Pragmas |publisher=Comeaucomputing.com |date= |accessdate=2013-08-19 |archive-url=https://web.archive.org/web/20131211122659/http://www.comeaucomputing.com/4.0/docs/userman/pragma.html |archive-date=2013-12-11 |dead-url=yes }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[C++Builder XE Seattle]] || 支持&amp;lt;ref&amp;gt;{{cite web |url=http://docwiki.embarcadero.com/RADStudio/Seattle/en/Pragma_once |title=#pragma once - RAD Studio XE Seattle |publisher=Docwiki.embarcadero.com |date=2015-08-25 |accessdate=2016-03-10 |archive-date=2016-03-10 |archive-url=https://web.archive.org/web/20160310150020/http://docwiki.embarcadero.com/RADStudio/Seattle/en/Pragma_once |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Digital Mars C++]] || 支持&amp;lt;ref&amp;gt;{{cite web |url=http://www.digitalmars.com/ctg/pragmas.html#once |title=Pragmas |publisher=Digital Mars |date= |accessdate=2013-08-19 |archive-date=2013-12-12 |archive-url=https://web.archive.org/web/20131212140057/http://www.digitalmars.com/ctg/pragmas.html#once |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[GNU Compiler Collection|GCC]] || 支持&amp;lt;ref&amp;gt;{{cite web |url=http://gcc.gnu.org/onlinedocs/gcc-4.4.0/cpp/Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef |title=Alternatives to Wrapper #ifndef |publisher=Gcc.gnu.org |date= |accessdate=2013-08-20 |archive-date=2016-03-04 |archive-url=https://web.archive.org/web/20160304054532/http://gcc.gnu.org/onlinedocs/gcc-4.4.0/cpp/Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef |dead-url=no }}&amp;lt;/ref&amp;gt;（3.4版本以后&amp;lt;ref&amp;gt;{{cite web |url=http://gcc.gnu.org/gcc-3.4/changes.html |title=GCC 3.4 Release Series—Changes, New Features, and Fixes |publisher=Gcc.gnu.org |date= |accessdate=2013-08-19 |archive-date=2013-08-07 |archive-url=https://web.archive.org/web/20130807162212/http://gcc.gnu.org/gcc-3.4/changes.html |dead-url=no }}&amp;lt;/ref&amp;gt;）&lt;br /&gt;
|-&lt;br /&gt;
| [[Intel C++編譯器]] || 支持&amp;lt;ref&amp;gt;{{cite web|title=Diagnostic 1782: #pragma once is obsolete. Use #ifndef guard instead.|url=http://software.intel.com/en-us/articles/cdiag1782#comment-9466|work=Intel Developer Zones|accessdate=4 December 2013|archive-date=2013-12-11|archive-url=https://web.archive.org/web/20131211181306/http://software.intel.com/en-us/articles/cdiag1782#comment-9466|dead-url=no}}&amp;lt;/ref&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| [[Microsoft Visual C++]] || 支持&amp;lt;ref&amp;gt;{{cite web |url=http://msdn.microsoft.com/en-us/library/4141z1cx%28v=vs.71%29.aspx |title=once(C/C++) |publisher=Msdn.microsoft.com |date= |accessdate=2013-08-19 |archive-date=2016-08-10 |archive-url=https://web.archive.org/web/20160810031340/https://msdn.microsoft.com/en-us/library/4141z1cx(v=vs.71).aspx |dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Pelles C]] || 支持&amp;lt;ref&amp;gt;IDE help/documentation&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[IAR_Systems|IAR C/C++]] || 支持&amp;lt;ref&amp;gt;{{cite web|title=IAR C/C++ Development Guide|url=ftp://ftp.iar.se/WWWfiles/arm/webic/doc/EWARM_DevelopmentGuide.ENU.pdf|work=IAR Systems|accessdate=4 December 2013|deadurl=yes|archiveurl=https://web.archive.org/web/20170516173602/http://ftp.iar.se/WWWfiles/arm/webic/doc/EWARM_DevelopmentGuide.ENU.pdf|archivedate=2017年5月16日}}&amp;lt;/ref&amp;gt; (2022年以後&amp;lt;ref&amp;gt;Supported but not yet documented (doc planned for spring 2022)&amp;lt;/ref&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|[[Tiny_C_Compiler|TinyCC]]||支持&amp;lt;ref&amp;gt;{{cite web |url=http://repo.or.cz/tinycc.git/commitdiff/b08ce880822875d4bef103719179501d6ba38730 |title=TinyCC pragma once implementation |accessdate=19 June 2018 |archive-date=2021-12-07 |archive-url=https://web.archive.org/web/20211207185319/https://repo.or.cz/tinycc.git/commitdiff/b08ce880822875d4bef103719179501d6ba38730 |dead-url=no }}&amp;lt;/ref&amp;gt; (2015年以後)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
{{Reflist|30em}}&lt;br /&gt;
&lt;br /&gt;
== 外部連結 ==&lt;br /&gt;
* https://web.archive.org/web/20070317022009/http://msdn.microsoft.com/library/en-us/vclang/html/_PREDIR_Pragma_Directives.asp&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:#pragma once}}&lt;br /&gt;
[[Category:C語言]]&lt;br /&gt;
[[Category:C++]]&lt;br /&gt;
[[Category:C頭文件]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InternetArchiveBot</name></author>
	</entry>
</feed>