<p>在程式設計中，特別是在C語言和C++中，<b>標頭檔</b>或<b>包含檔案</b>是一個檔案，通常是原始碼的形式，由編譯器在處理另一個原始檔的時候自動包含進來。一般來說，程式設計師通過編譯器指令將標頭檔包含進其他原始檔的開始（或<i>頭部</i>）。
</p><p>一個標頭檔一般包含類、子程式、變數和其他識別碼的前置聲明。需要在一個以上原始檔中被聲明的識別碼可以被放在一個標頭檔中，並在需要的地方包含這個標頭檔。
</p><p>在C語言和C++中，標準庫函式習慣上在標頭檔中聲明，參見C標準函式庫和C++標準函式庫。
</p>


<h2><span id=".E4.BD.9C.E7.94.A8"></span><span id="作用">作用</span></h2>
<p>在大多數現代電腦程式語言中，程式可以被分成如子程式的更小的組件，這些組件可以通過許多物理源檔案分發，這些原始檔被單獨編譯。當一個子程式在定義的位置以外的地方被使用時，就需要引入前置聲明和函式原型的概念。例如，一個函式在一個原始檔中有如下定義：
</p>

<p>在另一個原始檔中參照的時候就可以聲明成這樣（包含函式原型）：
</p>

<p>但是，這個簡單的方法需要程式設計師為<code>add</code>在兩個地方維護函式聲明，一個是包含函式實現的檔案，以及使用該函式的檔案。如果函式的定義改變了，程式設計師必須要更改散布在程式中的所有的原型。
</p><p>標頭檔提供了解決辦法。模組的標頭檔聲明作為模組<i>公共介面</i>一部分的每一個函式、物件以及資料類型。例如，在下面的情況下，標頭檔僅包含<code>add</code>的聲明。每一個參照了<code>add</code>的原始檔使用<code>#include</code>來包含標頭檔：
</p>


<p>這樣就減少了維護的負擔：當定義改變的時候，只須更新聲明的一個獨立副本（在標頭檔中的那個）。在包含對應的定義的原始檔中也可以包含標頭檔，這給了編譯器一個檢查聲明和定義一致性的機會。
</p>

<p>通常，標頭檔被用來唯一指定介面，且多少提供一些文件來說明如何使用在該檔案中聲明的組件。在這個例子中，子程式的實現放在一個單獨的原始檔中，這個原始檔被單獨編譯。（在C和C++中有個例外，即行內函式。行內函式通常放在標頭檔中，因為大多數實現如果不知道其定義，在編譯時便無法適當的展開行內函式。）
</p>
<h2><span id=".E6.9B.BF.E4.BB.A3"></span><span id="替代">替代</span></h2>
<p>在存取聲明在不同檔案中的識別碼問題上，標頭檔不是唯一的解決方法。他們也有缺點，當定義改變的時候可能仍然需要在兩個地方來修改（標頭檔和原始檔）。一些更新的語言（如Java）省略掉了標頭檔，而使用<span data-orig-title="命名方案" data-lang-code="en" data-lang-name="英語" data-foreign-title="naming scheme"><span>命名方案</span></span>（naming scheme），這就允許編譯器來定位與介面和類實現相關的原始檔。
</p>
<h2><span id=".23include.E8.AF.AD.E5.8F.A5.E7.9A.84.E4.B8.A4.E7.A7.8D.E8.AF.AD.E6.B3.95"></span><span id="#include语句的两种语法">#include語句的兩種語法</span></h2>
<p><code>#include</code>語句有兩種方式包含標頭檔，分別是使用雙引號<code>" "</code>與左右尖括號<code>&lt; &gt;</code>。其區別是（對於不是使用完全檔案路徑名的）標頭檔的搜尋順序不同：
</p><p>使用雙引號<code>" "</code>的標頭檔的搜尋順序：
</p>
<ol><li>包含該<code>#include</code>語句的原始檔所在目錄；</li>
<li>包含該<code>#include</code>語句的已經打開的標頭檔的逆序（因為標頭檔可以<code>#include</code>另一個標頭檔構成一個序列）；</li>
<li>編譯選項-I所指定的目錄</li>
<li>環境變數INCLUDE所定義的目錄</li></ol><p>使用左右尖括號<code>&lt; &gt;</code>的標頭檔的搜尋順序：
</p>
<ol><li>編譯選項-I所指定的目錄</li>
<li>環境變數INCLUDE所定義的目錄</li></ol><h2><span id=".E5.8F.82.E8.A7.81"></span><span id="参见">參見</span></h2>
<ul><li>應用程式介面</li>
<li>介面描述語言</li>
<li>#pragma once</li></ul><h2><span id=".E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5"></span><span id="外部链接">外部連結</span></h2>
<ul><li>組織代碼檔案（以及使用標頭檔的陷阱）</li>
<li>C++標頭檔包含規則（頁面存檔備份，存於網際網路檔案館）</li></ul><!-- 
NewPP limit report
Parsed by mw2388
Cached time: 20230423234812
Cache expiry: 1814400
Reduced expiry: false
Complications: [show‐toc]
CPU time usage: 0.159 seconds
Real time usage: 0.180 seconds
Preprocessor visited node count: 138/1000000
Post‐expand include size: 193661/2097152 bytes
Template argument size: 109/2097152 bytes
Highest expansion depth: 4/100
Expensive parser function count: 7/500
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 5344/5000000 bytes
Lua time usage: 0.046/10.000 seconds
Lua memory usage: 4290674/52428800 bytes
Number of Wikibase entities loaded: 0/400
--><!--
Transclusion expansion time report (%,ms,calls,template)
100.00%   77.346      1 -total
 77.41%   59.872      1 Template:NoteTA
 17.67%   13.670      1 Template:Le
  1.38%    1.066      1 Template:Wayback
--><!-- Saved in parser cache with key zhwiki:pcache:idhash:770375-0!userlang=zh-tw!zh-tw and timestamp 20230423234812 and revision id 75304465. Rendering was triggered because: page-view
 -->
在程式設計中，特別是在 C 語言和 C++ 中，**標頭檔**或**包含檔案**是一個檔案，通常是原始碼的形式，由編譯器在處理另一個原始檔的時候自動包含進來。一般來說，程式設計師通過編譯器指令將標頭檔包含進其他原始檔的開始（或_頭部_）。

一個標頭檔一般包含類、子程式、變數和其他識別碼的前置聲明。需要在一個以上原始檔中被聲明的識別碼可以被放在一個標頭檔中，並在需要的地方包含這個標頭檔。

在 C 語言和 C++ 中，標準庫函式習慣上在標頭檔中聲明，參見 C 標準函式庫和 C++ 標準函式庫。

## 作用

在大多數現代電腦程式語言中，程式可以被分成如子程式的更小的組件，這些組件可以通過許多物理源檔案分發，這些原始檔被單獨編譯。當一個子程式在定義的位置以外的地方被使用時，就需要引入前置聲明和函式原型的概念。例如，一個函式在一個原始檔中有如下定義：

在另一個原始檔中參照的時候就可以聲明成這樣（包含函式原型）：

但是，這個簡單的方法需要程式設計師為 `add` 在兩個地方維護函式聲明，一個是包含函式實現的檔案，以及使用該函式的檔案。如果函式的定義改變了，程式設計師必須要更改散布在程式中的所有的原型。

標頭檔提供了解決辦法。模組的標頭檔聲明作為模組_公共介面_一部分的每一個函式、物件以及資料類型。例如，在下面的情況下，標頭檔僅包含 `add` 的聲明。每一個參照了 `add` 的原始檔使用 `#include` 來包含標頭檔：

這樣就減少了維護的負擔：當定義改變的時候，只須更新聲明的一個獨立副本（在標頭檔中的那個）。在包含對應的定義的原始檔中也可以包含標頭檔，這給了編譯器一個檢查聲明和定義一致性的機會。

通常，標頭檔被用來唯一指定介面，且多少提供一些文件來說明如何使用在該檔案中聲明的組件。在這個例子中，子程式的實現放在一個單獨的原始檔中，這個原始檔被單獨編譯。（在 C 和 C++ 中有個例外，即行內函式。行內函式通常放在標頭檔中，因為大多數實現如果不知道其定義，在編譯時便無法適當的展開行內函式。）

## 替代

在存取聲明在不同檔案中的識別碼問題上，標頭檔不是唯一的解決方法。他們也有缺點，當定義改變的時候可能仍然需要在兩個地方來修改（標頭檔和原始檔）。一些更新的語言（如 Java）省略掉了標頭檔，而使用命名方案（naming scheme），這就允許編譯器來定位與介面和類實現相關的原始檔。

## #include 語句的兩種語法

`#include` 語句有兩種方式包含標頭檔，分別是使用雙引號 `" "` 與左右尖括號 `< >`。其區別是（對於不是使用完全檔案路徑名的）標頭檔的搜尋順序不同：

使用雙引號 `" "` 的標頭檔的搜尋順序：

1. 包含該 `#include` 語句的原始檔所在目錄；
2. 包含該 `#include` 語句的已經打開的標頭檔的逆序（因為標頭檔可以 `#include` 另一個標頭檔構成一個序列）；
3. 編譯選項 - I 所指定的目錄
4. 環境變數 INCLUDE 所定義的目錄

使用左右尖括號 `< >` 的標頭檔的搜尋順序：

1. 編譯選項 - I 所指定的目錄
2. 環境變數 INCLUDE 所定義的目錄

## 參見

* 應用程式介面
* 介面描述語言
* #pragma once

## 外部連結

* 組織代碼檔案（以及使用標頭檔的陷阱）
* C++ 標頭檔包含規則（頁面存檔備份，存於網際網路檔案館）
.h