當前位置:首頁 » 編程軟體 » 預編譯和預處理區別

預編譯和預處理區別

發布時間: 2025-02-01 05:30:42

python編譯是什麼意思

預編譯又稱為預處理,是做些代碼文本的替換工作。處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等,就是為編譯做的預備工作的階段主要處理#開始的預編譯指令。
編譯(compilation , compile)
1、利用編譯程序從源語言編寫的源程序產生目標程序的過程。
2、用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
更多Python知識請關注Python視頻教程欄目。

Ⅱ 預編譯和預處理有什麼區別,他們是一樣的嗎

預編譯(預處理)就是在正式編譯之前的,為正式編譯做准備,處理以#開頭的指令,兩者是一樣的,只是兩種叫法而已

Ⅲ c/c 語言編譯程序的首要工作是

答案是A

C/C++程序編譯過程包括下面4個階段:
1.預處理,
2.編譯,
3.匯編,
4.鏈接。

下面我們就來詳細分析下這幾個階段。

1.預處理
預處理相當於根據預處理指令組裝新的C/C++程序。經過預處理,
會產生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出文件,
這個文件的含義同原本的文件無異,只是內容上有所不同。

讀取C/C++源程序,對其中的偽指令(以#開頭的指令)進行處理
①將所有的「#define」刪除,並且展開所有的宏定義
②處理所有的條件編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「endif」等。
這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。
預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉。
③處理「#include」預編譯指令,將被包含的文件插入到該預編譯指令的位置。
(注意:這個過程可能是遞歸進行的,也就是說被包含的文件可能還包含其他文件)
刪除所有的注釋
添加行號和文件名標識。
以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生的編譯錯誤或警告時能夠顯示行號
保留所有的#pragma編譯器指令

2.編譯
將預處理完的文件進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的匯編代碼文件。

3.匯編
將編譯完的匯編代碼文件翻譯成機器指令,並生成可重定位目標程序的.o文件,該文件為二進制文件,位元組編碼是機器指令。
匯編器是將匯編代碼轉變成機器可以執行的指令,每一個匯編語句幾乎都對應一條機器指令。
所以匯編器的匯編過程相對於編譯器來講比較簡單,它沒有復雜的語法,也沒有語義,也不需要做指令優化,
只是根據匯編指令和機器指令的對照表一一翻譯即可。

4.鏈接
通過鏈接器將一個個目標文件(或許還會有庫文件)鏈接在一起生成一個完整的可執行程序。
由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。

例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變數或者函數調用等);
在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也就是將在一個文件中引用的符號同該符號在另外
一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠被操作系統裝入執行的統一整體。
至此,大致經過這幾個步驟,一個完整的可執行程序產生了。

c語言 #if 和if的區別

加#的都是編譯預處理語句:
#if 表達式
#endif
表示的意思是如果if後面的表達式不為0的話就編譯#if#endif之間的語句,否則就不編譯。

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

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

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

處理#開頭的指令,比如拷貝#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

熱點內容
安卓怎麼凍結蘋果id賬號 發布:2025-02-01 08:45:16 瀏覽:639
pythonforosx 發布:2025-02-01 08:43:50 瀏覽:763
ftp建站工具 發布:2025-02-01 08:42:07 瀏覽:532
linux開啟ntp 發布:2025-02-01 08:31:42 瀏覽:284
excel密碼加密 發布:2025-02-01 08:17:01 瀏覽:539
陌陌在手機哪個文件夾 發布:2025-02-01 08:13:49 瀏覽:317
proe50解壓打不開 發布:2025-02-01 08:11:17 瀏覽:390
密碼按錯三次怎麼辦 發布:2025-02-01 08:00:24 瀏覽:851
傳送門什麼配置好玩 發布:2025-02-01 08:00:17 瀏覽:1000
android監聽輸入法狀態 發布:2025-02-01 07:52:44 瀏覽:283