預編譯的過程

2021-06-29 15:12:44 字數 1472 閱讀 6975

圖一

圖二

**預處理:

在預處理階段進行的工作是純粹的替換和展開,沒有任何的計算功能和檢查功能,這也正是巨集定義出現在預處理階段的原因。下面我主要說一下巨集定義的優點和缺點:

優點:1.速度方面:當巨集定義的是乙個函式時,預處理用複製巨集的**方式代表函式呼叫,省去了引數壓棧、生成組合語言的call

呼叫、返回引數等過程,加快了執行的速度。

2.功能方面:巨集用來定義型別的別名,這些型別不僅包括(int,char,float)

等。3.作用域:巨集定義沒有作用域的限制。

4.解決衝突:在專案的過程中,有多個c

語言程式時,可以通過巨集指令(

#define

、#undef

、#if

、#ifdef

)解決衝突。

缺點:

1.安全性差:在預處理階段,只是對巨集命令的展開,不進行判斷正確性,例如:#define m 3.1415

h, 在函式中用到的

m直接帶入,不檢查

m是否正確。

2.正確率低:當巨集用來定義表示式的時候,例如:#define fun(a,b) a*b

**中有fun(2+3,1+2),

本來結果為

15,但真實的結果為7。

3.無法單步除錯。 4.

在c++

中,使用巨集無法操作類中的私有成員。

typedef和define有著相同的功能,那麼他們有啥區別呢? 1.

原理不同:define

是預處理指令,在預處理時進行簡單的文字的替換,不進行正確性的檢查。而

typedef

是關鍵字,它有自己的作用域,並且進行錯誤的檢查,如圖1的程式:

2.功能不同:typedef

不僅可以定義資料型別,還可以定義自定義型別,如

struct。3.

作用域不同:#define

沒有作用域的限制,

typedef

有自己的作用域。

4.對指標的操作不同,如圖二程式;

常量指標:指標指向的常量的值不可以改變。

指標常量:指標的內容不可以改變,即指標只可以指向乙個固定的指向。

*可以通過巨集求得記憶體的偏移位址。

ansi  c

標準允許值為

0的常量被強制轉換為任意一種型別的指標,

#define   offset(type,field) &((type *)0->field)

JS的預編譯過程

預編譯發生在函式執行的前一刻 預編譯 全域性 三部曲 生成go物件 global object go window go 找形參和變數宣告,將變數和形參名作為go屬性名,值為undefined 在函式體裡面找函式宣告,值 賦予函式體 預編譯 區域性 四部曲 生成ao物件 activation obj...

編譯的整個過程 預編譯 編譯 彙編 鏈結

編譯分為四個步驟 每個步驟將檔案編譯成別的格式,如下 步驟未編譯 預編譯編譯 彙編鏈結 檔案fun.h fun.cpp test.cpp fun.i test.i fun.s test.s fun.o test.o projectname.exe 詳解 1.預編譯 預編譯過程主要做4件事 展開標頭檔...

預編譯 編譯 彙編 鏈結過程

將源 或者標頭檔案經過預編譯成乙個.i檔案。例如c 副檔名是.cpp,標頭檔案的副檔名可能是.hpp,預編譯後的副檔名是.i 預編譯的過程相當於下面的命令 對c語言檔案的處理 gcc e 原始檔 o目標檔案 對c 語言的檔案的處理 g gcc e 原始檔 o目標檔案 例如 gcc e hello.c...