[轉帖]c標頭檔(.h)的作用c標頭檔(.h)的作用

來源:互聯網
上載者:User
c標頭檔(.h)的作用 

  C語言的著作中,至今還沒發現把.h檔案的用法寫的透徹的。在實際應用中也只能依葫蘆畫瓢,只知其然不知其所以然,甚是鬱悶!閑來無事,便將搜集網路的相關內容整理一下,以便加深自己的理解

理論概述:
.h中一般放的是同名.c檔案中定義的變數、數組、函數的聲明,需要讓.c外部使用的聲明。

1)h檔案作用:  

     1.方便開發:包含一些檔案需要的共同的常量,結構,類型定義,函數,變數申明;

  2. 使函數的範圍從函式宣告的位置開始,而不是函數定義的位置(實踐總結)

  3 .提供介面:對一個軟體包來說可以提供一個給外界的介面(例如: stdio.h)。

2)h檔案裡應該有什麼:常量,結構,類型定義,函數,變數申明。

3)h檔案不應該有什麼:變數定義, 函數定義。

4)extern問題:
  1.對於變數需要extern;

  2.對於函數不需要因為函數的預設狀態是extern的.如果一個函數要改變為只在檔案內可見,加static。

5)include包含問題:雖然申明和類型定義可以重複,不過推薦使用條件編譯。
  #ifndef _FILENAME_H,
  #define _FILENAME_H
  ……

  #endif

實踐總結
先看最簡單的程式:hello world

1 /*test1.c*/
2 main()
3 {
4   printf("Hello World!\n");
5 }

注意,test1中並沒有.h檔案,編譯可以順利通過。把程式做下改動,下面這個:

1 /*test2.c*/
2 prtstr()
3 {
4   printf("Hello World!\n");
5 }
6 main()
7 {
8 prtstr();
9 }

test2.c中還是沒有.h檔案,編譯仍可以順利通過。再把程式改動下:

 1 /*test3.c*/
2 main()
3 {
4   prtstr();
5 }
6
7 prtstr()
8 {
9   printf("Hello World!\n");
10 }

test3.c中仍然沒有.h檔案,編譯失敗→_→。難道函數的位置影響編譯的過程?現在我們來熟悉一下C語言中的概念:範圍。

  我們在這裡只講述與.h檔案相關的頂層範圍, 頂層範圍就是從聲明點延伸到來源程式文本結束, 就prtstr()這個函數來說,他沒有單獨的聲明,只有定義,那麼就從他定義的行開始,到檔案結束, 也就是說,在test2.c的main()函數的引用點上,已經是他的範圍。 test3.c的main()函數的引用點上,還不是他的範圍,所以會編譯出錯. 這種情況怎麼辦呢? 有兩種方法 ,一個就是讓我們回到test2.c, 順序對我們來說沒什麼, 誰先誰後不一樣呢,只要能編譯通過,程式能運行, 就讓main()檔案總是放到最後吧。那就讓我們來看另一個常式,讓我們看看這個方法是不是在任何時候都會起作用. 

 1 /*test4.c*/ 
2 play2()
3 {
4 play1();
5 }
6
7 play1()
8 {
9 play2();
10 }
11
12 main()
13 {
14 play1();
15 }

這就是經常用到的一種演算法, 函數嵌套。play1 和play2 這兩個函數哪個放到前面呢?這時就需要我們來使用第二種方法,使用聲明.

 1 /*test5.c*/ 
2 play1();
3 play2();
4
5 play2()
6 {
7   play1();
8 }
9   play1()
10 {
11   play2();
12 }
13 main()
14 {
15   play1();
16 }

  一個大型的軟體項目,可能有幾千個,上萬個 play, 而不只是 play1,play2這麼簡單, 這樣就可能有 N 個類似 play1(); play2(); 這樣的聲明, 這個時候就需要我們想辦法把這樣的 play1(); play2(); 另行管理, 而不是把他放在.c檔案中, 於是.h 檔案出現了.

 1 /*test.h */
2 play1();
3 play2();
4 /* test6.C */
5 #include “test.h”
6 play2()
7 {
8   play1();
9 }
10 play1();
11 {
12   play2();
13 }
14 main()
15 {
16   play1();
17 }

上面是.h檔案的最基本的功能。

原帖地址:http://www.cnblogs.com/polestar/archive/2012/02/24/2366724.html

  C語言的著作中,至今還沒發現把.h檔案的用法寫的透徹的。在實際應用中也只能依葫蘆畫瓢,只知其然不知其所以然,甚是鬱悶!閑來無事,便將搜集網路的相關內容整理一下,以便加深自己的理解

理論概述:
.h中一般放的是同名.c檔案中定義的變數、數組、函數的聲明,需要讓.c外部使用的聲明。

1)h檔案作用:  

     1.方便開發:包含一些檔案需要的共同的常量,結構,類型定義,函數,變數申明;

  2. 使函數的範圍從函式宣告的位置開始,而不是函數定義的位置(實踐總結)

  3 .提供介面:對一個軟體包來說可以提供一個給外界的介面(例如: stdio.h)。

2)h檔案裡應該有什麼:常量,結構,類型定義,函數,變數申明。

3)h檔案不應該有什麼:變數定義, 函數定義。

4)extern問題:
  1.對於變數需要extern;

  2.對於函數不需要因為函數的預設狀態是extern的.如果一個函數要改變為只在檔案內可見,加static。

5)include包含問題:雖然申明和類型定義可以重複,不過推薦使用條件編譯。
  #ifndef _FILENAME_H,
  #define _FILENAME_H
  ……

  #endif

實踐總結
先看最簡單的程式:hello world

1 /*test1.c*/
2 main()
3 {
4   printf("Hello World!\n");
5 }

注意,test1中並沒有.h檔案,編譯可以順利通過。把程式做下改動,下面這個:

1 /*test2.c*/
2 prtstr()
3 {
4   printf("Hello World!\n");
5 }
6 main()
7 {
8 prtstr();
9 }

test2.c中還是沒有.h檔案,編譯仍可以順利通過。再把程式改動下:

 1 /*test3.c*/
2 main()
3 {
4   prtstr();
5 }
6
7 prtstr()
8 {
9   printf("Hello World!\n");
10 }

test3.c中仍然沒有.h檔案,編譯失敗→_→。難道函數的位置影響編譯的過程?現在我們來熟悉一下C語言中的概念:範圍。

  我們在這裡只講述與.h檔案相關的頂層範圍, 頂層範圍就是從聲明點延伸到來源程式文本結束, 就prtstr()這個函數來說,他沒有單獨的聲明,只有定義,那麼就從他定義的行開始,到檔案結束, 也就是說,在test2.c的main()函數的引用點上,已經是他的範圍。 test3.c的main()函數的引用點上,還不是他的範圍,所以會編譯出錯. 這種情況怎麼辦呢? 有兩種方法 ,一個就是讓我們回到test2.c, 順序對我們來說沒什麼, 誰先誰後不一樣呢,只要能編譯通過,程式能運行, 就讓main()檔案總是放到最後吧。那就讓我們來看另一個常式,讓我們看看這個方法是不是在任何時候都會起作用. 

 1 /*test4.c*/ 
2 play2()
3 {
4 play1();
5 }
6
7 play1()
8 {
9 play2();
10 }
11
12 main()
13 {
14 play1();
15 }

這就是經常用到的一種演算法, 函數嵌套。play1 和play2 這兩個函數哪個放到前面呢?這時就需要我們來使用第二種方法,使用聲明.

 1 /*test5.c*/ 
2 play1();
3 play2();
4
5 play2()
6 {
7   play1();
8 }
9   play1()
10 {
11   play2();
12 }
13 main()
14 {
15   play1();
16 }

  一個大型的軟體項目,可能有幾千個,上萬個 play, 而不只是 play1,play2這麼簡單, 這樣就可能有 N 個類似 play1(); play2(); 這樣的聲明, 這個時候就需要我們想辦法把這樣的 play1(); play2(); 另行管理, 而不是把他放在.c檔案中, 於是.h 檔案出現了.

 1 /*test.h */
2 play1();
3 play2();
4 /* test6.C */
5 #include “test.h”
6 play2()
7 {
8   play1();
9 }
10 play1();
11 {
12   play2();
13 }
14 main()
15 {
16   play1();
17 }

上面是.h檔案的最基本的功能。

原帖地址:http://www.cnblogs.com/polestar/archive/2012/02/24/2366724.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.