當前位置:編程學習大全網 - 源碼下載 - ARM中.c文件和.h文件有什麽區別?

ARM中.c文件和.h文件有什麽區別?

其實要理解C文件與頭文件有什麽不同之處,首先需要弄明白編譯器的工作過程,壹般說來編譯器會做以下幾個過程:

1.預處理階段

2.詞法與語法分析階段

3.編譯階段,首先編譯成純匯編語句,再將之匯編成跟CPU相關的二進制碼,生成各個目標文件

4.連接階段,將各個目標文件中的各段代碼進行絕對地址定位,生成跟特定平臺相關的可執行文件,當然,最後還可以用objcopy生成純二進制碼,也就是去掉了文件格式信息

編譯器在編譯時是以C文件為單位進行的,也就是說如果妳的項目中壹個C文件都沒有,那麽妳的項目將無法編譯,連接器是以目標文件為單位,它將壹個或多個目標文件進行函數與變量的重定位,生成最終的可執行文件,在PC上的程序開發,壹般都有壹個main函數,這是各個編譯器的約定,當然,妳如果自己寫連接器腳本的話,可以不用main函數作為程序入口!!!!

有了這些基礎知識,再言歸正傳,為了生成壹個最終的可執行文件,就需要壹些目標文件,也就是需要C文件,而這些C文件中又需要壹個main函數作為可執行程序的入口,那麽我們就從壹個C文件入手,假定這個C文件內容如下:

#include

#include "mytest.h "

int main(int argc,char **argv)

{

test = 25;

printf( "test.................%d\n ",test);

}

頭文件內容如下:

int test;

現在以這個例子來講解編譯器的工作:

1.預處理階段:編譯器以C文件作為壹個單元,首先讀這個C文件,發現第壹句與第二句是包含壹個頭文件,就會在所有搜索路徑中尋找這兩個文件,找到之後,就會將相應頭文件中再去處理宏,變量,函數聲明,嵌套的頭文件包含等,檢測依賴關系,進行宏替換,看是否有重復定義與聲明的情況發生,最後將那些文件中所有的東東全部掃描進這個當前的C文件中,形成壹個中間“C文件”

2.編譯階段,在上壹步中相當於將那個頭文件中的test變量掃描進了壹個中間C文件,那麽test變量就變成了這個文件中的壹個全局變量,此時就將所有這個中間C文件的所有變量,函數分配空間,將各個函數編譯成二進制碼,按照特定目標文件格式生成目標文件,在這種格式的目標文件中進行各個全局變量,函數的符號描述,將這些二進制碼按照壹定的標準組織成壹個目標文件

3.連接階段,將上壹步成生的各個目標文件,根據壹些參數,連接生成最終的可執行文件,主要的工作就是重定位各個目標文件的函數,變量等,相當於將個目標文件中的二進制碼按壹定的規範合到壹個文件中

再回到C文件與頭文件各寫什麽內容的話題上:

理論上來說C文件與頭文件裏的內容,只要是C語言所支持的,無論寫什麽都可以的,比如妳在頭文件中寫函數體,只要在任何壹個C文件包含此頭文件就可以將這個函數編譯成目標文件的壹部分(編譯是以C文件為單位的,如果不在任何C文件中包含此頭文件的話,這段代碼就形同虛設),妳可以在C文件中進行函數聲明,變量聲明,結構體聲明,這也不成問題!!!那為何壹定要分成頭文件與C文件呢?又為何壹般都在頭件中進行函數,變量聲明,宏聲明,結構體聲明呢?而在C文件中去進行變量定義,函數實現呢原因如下:

1.如果在頭文件中實現壹個函數體,那麽如果在多個C文件中引用它,而且又同時編譯多個C文件,將其生成的目標文件連接成壹個可執行文件,在每個引用此頭文件的C文件所生成的目標文件中,都有壹份這個函數的代碼,如果這段函數又沒有定義成局部函數,那麽在連接時,就會發現多個相同的函數,就會報錯

2.如果在頭文件中定義全局變量,並且將此全局變量賦初值,那麽在多個引用此頭文件的C文件中同樣存在相同變量名的拷貝,關鍵是此變量被賦了初值,所以編譯器就會將此變量放入DATA段,最終在連接階段,會在DATA段中存在多個相同的變量,它無法將這些變量統壹成壹個變量,也就是僅為此變量分配壹個空間,而不是多份空間,假定這個變量在頭文件沒有賦初值,編譯器就會將之放入BSS段,連接器會對BSS段的多個同名變量僅分配壹個存儲空間

3.如果在C文件中聲明宏,結構體,函數等,那麽我要在另壹個C文件中引用相應的宏,結構體,就必須再做壹次重復的工作,如果我改了壹個C文件中的壹個聲明,那麽又忘了改其它C文件中的聲明,這不就出了大問題了,程序的邏輯就變成了妳不可想象的了,如果把這些公***的東東放在壹個頭文件中,想用它的C文件就只需要引用壹個就OK了!!!這樣豈不方便,要改某個聲明的時候,只需要動壹下頭文件就行了

4.在頭文件中聲明結構體,函數等,當妳需要將妳的代碼封裝成壹個庫,讓別人來用妳的代碼,妳又不想公布源碼,那麽人家如何利用妳的庫呢?也就是如何利用妳的庫中的各個函數呢壹種方法是公布源碼,別人想怎麽用就怎麽用,另壹種是提供頭文件,別人從頭文件中看妳的函數原型,這樣人家才知道如何調用妳寫的函數,就如同妳調用printf函數壹樣,裏面的參數是怎樣的妳是怎麽知道的還不是看人家的頭文件中的相關聲明啊!!!當然這些東東都成了C標準,就算不看人家的頭文件,妳壹樣可以知道怎麽使用

  • 上一篇:如何在手機微信上制作菜單如何在手機微信上制作菜單表
  • 下一篇:新能源車充電樁車牌識別的優點是什麽?
  • copyright 2024編程學習大全網