用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