當前位置:首頁 » 編程軟體 » 預編譯階段

預編譯階段

發布時間: 2022-01-09 01:53:26

⑴ C語言文件的編譯與執行的四個階段並分別描述

開發C程序有四個步驟:編輯、編譯、連接和運行。

任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。

1、預處理:導入源程序並保存(C文件)。

2、編譯:將源程序轉換為目標文件(Obj文件)。

3、鏈接:將目標文件生成為可執行文件(EXE文件)。

4、運行:執行,獲取運行結果的EXE文件。

(1)預編譯階段擴展閱讀:

將C語言代碼分為程序的幾個階段:

1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。

2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。

3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。

4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。

⑵ 什麼是預編譯,何時需要預編譯

預編譯又稱為預處理,是做些代碼文本的替換工作

預編譯又稱為預處理,是做些代碼文本的替換工作

處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等

就是為編譯做的預備工作的階段

主要處理#開始的預編譯指令

預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:

(1)#include 指令

該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用" "括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為"h"或"cpp"的頭文件。

注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用""把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。

(2)#define指令

該指令有三種用法:

第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;

第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);

第三種是定義"函數",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。

第四種是定義"宏函數",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。

(3)#if、#else和#endif指令

這些指令一般這樣配合使用:

#if defined(標識) //如果定義了標識

要執行的指令

#else

要執行的指令

#endif

在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:

#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,

//每個頭文件的標識符都不應相同。

//起標識符的常見方法是若頭文件名為"abc.h"

//則標識為"abc_h"

#define XXX

真正的內容,如函數聲明之類

#endif

⑶ 編譯過程分為哪幾個階段各階段的遵循的原則、識別機構、使用的文法編譯原理

編譯原理中的遍概念
編譯階段也常常劃分為兩大步驟,分析步驟和綜合步驟 分析步驟和綜合步驟 分析步驟是指對源程序的分析 -線性分析(詞法分析或掃描) -層次分析(語法分析) -語義分析 綜合步驟是指後端的工作,為目標程序的生成而進行的綜合

你分析過嗎?若按照這種組合方式實現編譯程序,可以設想,某一編譯程序的前端加上相應不同的後 端則可以為不同的機器構成同一個源語言的編譯程序。也可以設想,不同語言編譯的前端生成同一種中間 語言,再使用一個共同的後端,則可為同一機器生成幾個語言的編譯程序。

一個編譯過程可由一遍、兩遍或多遍完成。所謂"遍",也稱作"趟",是對源程序或其等價的中間語言程 序從頭到尾掃視並完成規定任務的過程。每一遍掃視可完成上述一個階段或多個階段的工作。例如一遍可 以只完成詞法分析工作;一遍完成詞法分析和語法分析工作;甚至一遍完成整個編譯工作。對於多遍的編 譯程序,第一遍的輸入是用戶書寫的源程序,最後一遍的輸出是目標語言程序,其餘是上一遍的輸出為下 一遍的輸入。

在實際的編譯系統的設計中,編譯的幾個階段的工作究竟應該怎樣組合,即編譯程序究竟分成幾遍, 參考的因素主要是源語言和機器(目標機)的特徵。比如源語言的結構直接影響編譯的遍的劃分;像 PL/1 或 ALGOL 68 那樣的語言,允許名字的說明出現在名字的使用之後,那麼在看到名字之前是不便為包含該名 字的表達式生成代碼的,這種語言的編譯程序至少分成兩遍才容易生成代碼。另外機器的情況,即編譯程 序工作的環境也影響編譯程序的遍數的劃分。遍數多一點,整個編譯程序的邏輯結構可能清晰些,但遍數 多即意味著增加讀寫中間文件的次數,勢必消耗較多時間,一般會比一遍的編譯要慢。

⑷ 編譯和預編譯有什麼區別。

預編譯又稱為預處理,是做些代碼文本的替換工作。

處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等

就是為編譯做的預備工作的階段

主要處理#開始的預編譯指令
編譯(compilation , compile) 1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。 2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。

⑸ C++的include機制是怎樣的在預編譯階段是如何層層深入查找文件

比如D include了C,而C又include了A和B,那麼編譯的時候編譯器看到D的include後就去找C的 include,然後遇到了include A,B那麼就又去找A,和B.
上面的是在找類型定義的時候回去做這些處理,如果在某一層找到了就不向上找了,例如D裡面用到的類型在C裡面找到了,那麼就不會去找A和B了

⑹ C語言預處理編譯鏈接各個階段錯誤,分階段的說一下

預處理階段主要是處理宏指令,像什麼#include指令、#define指令還有條件編譯指令等。
編譯階段主要是檢查C語言程序的語法錯誤,即編寫的代碼是否符合C語言規則,編譯是以.c源文件為單位編譯成.obj文件(或者是.o文件)。
鏈接階段,就是把相關的.obj文件、所需的庫文件等組合成一個可執行的文件。如果缺少相關所需文件,就會鏈接報錯。
指針異常,數組下標越界這些錯誤屬於語義錯誤,這個只能在執行的時候才能發現問題,這些也叫運行時錯誤。

⑺ C語言源程序的編譯過程包括哪三個階段

編譯:將源程序轉換為擴展名為.obj的二進制代碼
連接:將obj文件進行連接,加入庫函數等生成可執行文件
運行:執行可執行文件,有錯返回修改,無錯結束

⑻ 編譯原理,編譯過程哪七個階段,不是六個階段嗎 請教!!!急切!!!謝謝!

預處理,詞法分析,語法分析,語義分析,中間代碼產生,代碼優化,目標代碼產生

⑼ C語言預編譯階段字元串轉整形

預編譯階段不能運行函數或者代碼,所以沒辦法轉為整型。
只能到運行階段才可以轉。
這種的建議你用兩個宏定義,一個「12」一個整型12.

熱點內容
文件拒絕訪問win8 發布:2024-11-11 04:42:49 瀏覽:388
win8瀏覽器緩存 發布:2024-11-11 04:41:25 瀏覽:986
圖像聚類分割演算法 發布:2024-11-11 04:35:03 瀏覽:927
泰劇能緩存 發布:2024-11-11 04:34:19 瀏覽:423
蘋果相冊如何設置密碼 發布:2024-11-11 04:32:39 瀏覽:379
查看電腦訪問的程序伺服器地址 發布:2024-11-11 04:24:35 瀏覽:253
ubuntu1204源碼 發布:2024-11-11 04:14:27 瀏覽:180
linuxcpu核數查看 發布:2024-11-11 04:06:53 瀏覽:601
指尖瀏覽器緩存 發布:2024-11-11 04:00:34 瀏覽:978
中國移動代理伺服器地址如何查詢 發布:2024-11-11 03:55:23 瀏覽:137