巨集常量:為了實現簡單,會定義巨集常量
優點: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 裡面的那...