C語言中.h和.c文件解析


     用Keil軟件看別人的工程的時候,看到工程里有.h文件和.c文件,比較納悶,因此收集資料解開心中疑惑。

      1、首先是用Keil軟件來看工程的,所以工程中所看到的.h和.c文件肯定是跟Keil軟件(編譯器)有關。

       1.1、編譯器的工作過程:

        1.1.1、預處理階段。主要是處理“#include”、“#define”、"#ifdef...#endif"、"#ifndef...#endif"等語句。

        1.1.2、詞法與語法分析階段。(分析c語言的語法)

        1.1.3、編譯階段:從main.c文件進入,編譯成純匯編語句,再將之匯編成跟CPU相關的二進制碼,生成各個目標文件(.obj文件)。

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

        1.2、備注:

         1.2.1、編譯器在編譯時是以c文件為單位進行的。

         1.2.2、連接器是以目標文件為單位,將一個或多個目標文件進行函數與變量的重定位,生成最終的可執行文件。在PC上的程序開發,一般都有一個main函數,主要是因為編譯器的連接器腳本基本是寫main函數作為程序的入口。

         1.2.3、編譯器的工作流程:查找main.c文件 ---> 目標文件 ---> 可執行文件。

        1.3、舉例:

1 #include<stdio.h>
2 #include"mytest.h"
3 int main(int argc,char **argv)
4 {
5       test = 25;
6       printf("testl = %d\n",test);
7 }

      mytest.h頭文件內容如下:

1 #ifndef  mytest.h
2 #difine  mytest.h
3 
4 int test;
5 
6 #endif // endof mytest.h

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

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

       2、詞法與語法檢測。

       3、編譯階段:在上一步中,相當與將那個頭文件中的test變量掃描進了一個中間c文件,所以test變量是這個文件中的一個全局變量。

 

待續。。。

----------------

Hayder

E:hayder-su@qq.com

    

 

           

 

 

    


免責聲明!

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



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