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. 1 /*test1.c*/
  2. 2 main()
  3. 3 {
  4. 4    printf( "Hello World!\n");
  5. 5 }

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


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


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


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

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

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


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

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


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


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



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

上面是.h文件的最基本的功能。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM