1 9 標頭檔案

2022-03-04 08:43:24 字數 2931 閱讀 3060

from

在程式中,.cpp擴充套件的檔案並不是唯一一種常見的檔案。另一種檔案稱為標頭檔案,有時被稱為include file。都檔案基本都有乙個.h副檔名。標頭檔案的目的是將其它檔案要用到的宣告整合到一起。

標準庫標頭檔案的使用

看一下下面的程式:

#include

2:

int main()

3:
這個程式使用cout將hello, world!輸出到控制台的螢幕中。但是,你的程式從沒有定義cout,編譯器如何知道cout是什麼呢?答案是,cout在標頭檔案iostream中已經宣告過了。當我們使用#include 時,我們已經告訴編譯器定位然後讀取標頭檔案iostream中的所有宣告。

記住標頭檔案中往往只包含了宣告。它們並不定義具體的實現,而且你已經知道如果連線過程中,不能夠找到你使用的東西的定義,你的程式在鏈結時將會出錯。那麼如果cout不是在iostream標頭檔案中定義的,它實際又在**實現的呢?它是在執行庫支援下實現的,在鏈結的過程中執行庫會自動的鏈結到你的程式。

庫是能夠反覆被很多程式使用的**的集合。更據代表性的來講,乙個庫包含了標頭檔案,標頭檔案中包含了庫里的任何能夠被使用者使用的東西的宣告,預編譯物件將所喲逇**用機器碼進行了實現。在windows中庫的副檔名通常是 .lib 或 .dll,在unix中,通常為 .a 或 .so。為什麼要進行預處理呢。首先,由於庫很少改變,它們通常不需要反覆編譯。每次都編譯它們會浪費很多時間。其次,由於預編譯物件是機器語言,它阻止人改變**,出於對智財權的保護,對於那些不想讓別人知道源**的人來說是很重要的。

編寫你自己的標頭檔案

現在讓我們回到前面討論過的問題。我們有兩個檔案add.cpp和main.cpp

add.cpp:

int add(int x, int y)

2:
main.cpp

#include

2:
3:

int add(int x, int y); // forward declaration using function prototype

4:
5:

int main()

6:
這裡使用了前置宣告,編譯時編譯器能夠知道使用的add具體是什麼。前面提到過,在每次使用函式前寫前置宣告是一件很煩人的事情。

標頭檔案能夠較少我們這方面的壓力。乙個標頭檔案只需要寫一次,就能夠在很多原始檔中使用。這也有助於使得函式原型改變時造成的改動減小(如,增加乙個引數)。

書寫我們的標頭檔案是相當簡單的。標頭檔案包含兩部分。第一部分是標頭檔案保護,在預處理器一節中會詳細介紹。第二部分是實際的內容,用來宣告我們想要其他原始檔能夠看到的函式。我們的標頭檔案的副檔名也是.h。

add.h:

#ifndef add_h

2:

#define add_h

3:
4:

int add(int x, int y); // function prototype for add.h

5:
6:

#endif

為了main中能夠使用標頭檔案,必須將它包含進去。下面是乙個新的main.cpp:

#include

2:

#include

"add.h"

// this brings in the declaration for add()

3:
4:

int main()

5:
當編譯器讀到#include "add.h"這一行的時候,它將add.h中的內容都複製到當前的檔案中。因為我們的add.h中包含了函式add的原型,作為函式add的前置宣告。

因此,我們的程式能夠正確的編譯和鏈結。

你也許會很好奇為什麼對於iostream我們使用了尖括號,對於add.h我們使用了雙引號。原因是尖括號告訴編譯器我們包含的標頭檔案是編譯器包含的。雙引號告訴編譯器標頭檔案是我們提供的,這告訴編譯器首先在當前包含原始檔的資料夾中尋找標頭檔案。

規則:包含與編譯器結合在乙個的標頭檔案使用尖括號。包含其他的標頭檔案使用雙引號。

另乙個通常問的問題是「為什麼iostream沒有.h副檔名」。因為iostream.h和iostream是不同的,要解釋它需要乙個簡短的歷史背景。

當c++最初被建立的時候,標準執行庫中的所有檔案都是以.h結尾的。一直都是始終如一的,cout和cin的原來的版本也都存在於iostream.h中。當語言被ansi委員會標準化後,它們決定將所有執行庫的函式移到std命名空間下(這是乙個好想法)。但是,又引起了乙個問題:如果把所有的函式移到std命名空間,以前的程式都將不能執行。

為了解決這麼問題,一系列新的沒有.h字尾的具有相同名稱的標頭檔案被推薦使用。新的標頭檔案中的所有的內容都是在std命名空間內的。這樣,包含#include 舊的程式不必要被重寫,新的程式可以使用#include 。

當你使用標準庫的標頭檔案的時候確保你沒有使用.h擴充套件的標頭檔案。否則,你將會使用乙個被棄用的不再將被支援的版本。

作為邊注,標準庫中的很多標頭檔案沒有不具有不帶.h的版本,只有帶.h 的版本。對於這些檔案,使用.h的版本是可以的。很多這類庫向後相容標準c程式,c程式不支援命名空間。當你寫你的標頭檔案的時候,它們通常是以.h結尾的,你沒有必要將你的**放到std命名空間中。

規則: 如果庫中存在,就是用使用不帶.h的版本,通過std命名空間訪問功能。如果不存在不帶.h副檔名的版本,或是你自己建立的標頭檔案,使用.h的版本。

4412 標頭檔案作用

include 基礎標頭檔案,包括型別申明和printk include module init,init include module license include ioremap ioread32 iowrite32 include arch arm mach exynos include m...

(10)標頭檔案和注釋

標頭檔案 確保標頭檔案對此包含仍能安全工作的常用技術是預處理技術。它是c 從c語言繼承而來,預處理器是在編譯之前執行的一段程式,可以部分的改變我們所寫的程式,之前已經使用的一項預處理功能 include,當預處理器看到 includde標記時就會用指定標頭檔案的內容代替 include.c 程式還會...

C89 標頭檔案

雙引號 搜尋使用者所在目錄,如果找不到搜尋系統指定的目錄 尖括號 僅僅搜尋系統指定目錄 include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 i...