回覆列表
  • 1 # HK破鄂破YY

    副檔名為.h的檔案,在C語言中被稱為header file, 也就是標頭檔案。

    標頭檔案的資料格式就是普通的文字檔案,可以透過新建文字檔案(txt),再把副檔名改為.h的方式建立,在此不贅述。

    一、標頭檔案內容格式。

    標頭檔案內容並沒有固定的格式要求,不過一般為防止巢狀引用給編譯器帶來死鎖或者沒必要的開銷,一般約定整個標頭檔案中所有內容在一個條件編譯下,即如下格式:

    #ifndef 宏名

    #define 宏名

    //標頭檔案主體

    #endif

    這樣可以保證一個頭檔案在一個原始檔中最多隻被引用一次。為避免宏名重複,宏名一般由標頭檔案名轉換而來,如果標頭檔案名是xxx.h,那麼宏名一般定義為:

    _XXX_H_

    即前後各加一個下劃線,同時檔名中除數字、字母、下劃線以外的字元均轉換為下劃線(_)。

    標頭檔案主體中內容同樣沒有做強制約定,可以出現在原始檔(.c)中的任何程式碼均可以放在標頭檔案中。不過一般情況下可以包括以下幾種內容:

    1 引用其它標頭檔案,格式為

    #include <xxx.h>

    #include "xxx.h"

    二者區別在介紹標頭檔案引用時再詳細介紹。

    2 定義私有型別。比如

    typedef unsigned long U32; //為了簡寫而給無符號32位整型定義一個新的名字

    struct xxx {};

    也可以是enum, union等複雜型別。

    3 宏定義。比如

    #define MAX(a,b) (a>b?a:b)

    4 函式宣告。比如

    void test_function(void);

    5 全域性變數宣告。比如

    extern int global_var;

    6 如果有一個靜態全域性變數需要在不同原始檔中使用,但各檔案之間互不相關。那麼可以放在標頭檔案中。如:

    static int gs_var = 3;

    7 對於支援C99規範的C編譯器,還可以把行內函數定義在標頭檔案中。比如

    static inline int get_min(int a, int b){ if(a>b) return b; return a;}

    以上是常見的標頭檔案中的元素。但實際上標頭檔案中也可以放全域性變數的定義,全域性函式的實現等。但是標頭檔案中一旦定義了這樣的元素,這個標頭檔案在一個工程中只能被一個檔案引用,否則編譯器會報重複定義的錯誤。

    比如如果有一個規模很大的常量陣列,比如一副圖片的二進位制值,如果把它定義在原始檔中,就會顯得很冗餘,因為並不會經常修改。 這時可以定義在標頭檔案中,只在一個原始檔中引用,當有多幅圖片需要隨時更換時,也可以透過簡單的在原始檔中修改引用的標頭檔案名達到修改的目的。

    二、標頭檔案的引用。

    標頭檔案引用的方法其實之前已經大致說過了,在原始檔中引用標頭檔案和在標頭檔案中引用的格式是一樣的:

    #include<xxx.h>或者

    #include "xxx.h"

    xxx為標頭檔案名。

    用<>和""是有一定的區別的。在編譯器查詢標頭檔案的時候,會在兩個區域分別查詢。

    一個是系統標頭檔案區域,即類似於stdio.h一類的C庫函式標頭檔案區。

    另一個是自定義標頭檔案區,比如當前目錄,以及其它自定義的目錄。

    用<>時,編譯器會先在系統區域查詢,然後再查詢自定義區域。而用""時則相反。

    由於一般並不推薦自定義標頭檔案名與系統標頭檔案名相同(容易引起歧義並難以維護),所以先後順序並不是太重要,尤其在硬體速度越來越快的今天,使用哪種符號引用標頭檔案已經差別很小了。

  • 中秋節和大豐收的關聯?
  • 做美縫“貴”“不貴”,你真的會算嗎?