巨集的優缺點以及解決辦法

2021-10-08 11:21:54 字數 1327 閱讀 1053

巨集常量:為了實現簡單,會定義巨集常量

優點:1.一改全改,2.降低出錯率,3.可讀性高,

缺點:在預處理階段進行替換,不會進行型別檢測,安全性低(如果寫錯因為在預處理階段不會在檔案定義巨集處報錯,而會在使用處報錯);

建議:盡量使用const修飾的常量替換巨集常量

巨集函式

優點:1.不是函式,少了函式呼叫,提高程式執行效率,

2.少寫**:因為巨集函式是多條語句的封裝—注意:不能提高**復用率,因為巨集函式在預處理階段就展開了

3.可以提高**的可讀性

缺點:1.在預處理階段被替換,不會進行型別檢測,**安全性低

2.在預處理階段展開–>不能除錯

3.每個使用部分都會展開---->造成**膨脹

4.容易出錯,每個部分需要加括號

5.巨集函式可能會有***

eg:巨集函式可能會有***

#define max(a,b) ((a)>(b))?a:b;

intmain()

建議:使用內聯函式代替巨集函式–函式寫法,巨集的作用;

內聯函式

優點:1.因為是函式,引數有型別,會在編譯階段進行引數型別的檢測,**安全性高;

2.在debug模式下不會展開,可以除錯—也可以對編譯器進行設定來驗證到底是否展開

3.不用像巨集函式到處加括號,實現簡單

3.內聯函式是函式不會產生***

4.**可讀性高

5.在編譯階段展開,少了呼叫函式的開銷,可以提高程式的可讀性

缺點:每個使用內聯函式的位置幾乎都會展開,會造成**膨脹

注意

1.對於**長或者函式體內有迴圈 / 遞迴的函式編譯器優化時會自動忽略掉內聯(inline);

inline

intadd

(int left,

int right)

//inline只是建議編譯器在編譯時展開,到底會不會展開還得看編譯器;

intmain()

2.內聯函式具有檔案作用域—內聯函式只能在定義它的檔案中呼叫其他檔案中不可以;

分析:如果編譯器將此函式當作內聯函式來呼叫,在編譯時,並不會生成真正的此函式,而是將函式展開 反彙編中並不會出現call這一步;想在不同檔案中呼叫得有函式位址用來鏈結不同檔案,內聯函式不會呼叫函式(不會call)就不會生成位址,無法連線;

解決辦法

巨集常量用const修飾常量替換

巨集函式用內聯函式替換

巨集定義的優缺點

在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似 long,lpctstr 等等之類的,它們屬於微軟的自定義型別,但其本質上還是屬於c c 裡面的那幾個標準型別。那用巨集定義到底有什麼好處呢?先來看一下巨集的定義 用 define命令將乙個指定的識別符號 即巨集名 來代表乙個字串。它的一般型式...

巨集定義的優缺點

公尺哈遊三面的乙個問題,問的很深,從巨集定義是什麼,幹什麼用,優缺點,到別的語言為什麼沒有,層層深入,很好的問題。結果我也很好的掛掉了。所以來討論一下上述幾個問題正確的答案到底是什麼。1.首先什麼是巨集定義,在c 中只有 define算是巨集定義,其餘的 操作都叫預處理,所以巨集定義就是 defin...

巨集定義的優缺點

巨集定義的優缺點 當時沒答出來,只知道如果某個常量或者函式名很長的時候可以用巨集定義做替換,這樣的話程式也會比較美觀一點,可讀性也大大增強了。其實在用vc程式設計的時候就會遇到很多巨集定義,尤其是類似 long,lpctstr 等等之類的,它們屬於微軟的自定義型別,但其本質上還是屬於c c 裡面的那...