C 巨集函式和內聯函式的區別

2021-10-14 16:42:07 字數 1506 閱讀 9370

巨集優點

巨集缺點這裡附上《c和指標》中的一張**,總結巨集和函式十分到位,我就不多說了

#define定義乙個比如判斷大小,替換常量,很是方便。

不過現在也就用下,#define error_poweroff -1,#define _crt_secure_no_warnings 1這樣的和編譯器有關的東西,不會去寫巨集函式,巨集函式這東西,可讀性特別差,在c++中,一般用const/列舉/內聯去替代巨集。

但是,define巨集在某些方面真的是非常好用

1.替代路徑

#define eng_path_1 c:\program files (x86)

2.針對編譯器版本不相容報錯

#define _crt_secure_no_warnings 1

3.條件編譯

#ifdef 識別符號

程式段 1

#else

程式段 2

#endif

4.使用庫中的巨集

vc++中有許多有意思的巨集,都是大牛們寫出來的,真的是充滿智慧型,十分刁鑽,怎麼學也學不完,我個人擔心出錯就很少寫巨集,用函式代替了

inline函式是c++引入的機制,目的是解決使用巨集定義的一些缺點。

(1)內聯函式在編譯時展開,巨集在預編譯時展開;

(2)內聯函式直接嵌入到目標**中,巨集是簡單的做文字替換;

(3)內聯函式有型別檢測、語法判斷等功能,巨集沒有;

(4)inline函式是函式,巨集不是;

(5)巨集定義時要注意書寫(引數要括起來)否則容易出現歧義,內聯函式不會產生歧義;

用內聯函式替代巨集定義,消除巨集定義的缺點:

巨集定義使用預處理器實現,做一些簡單的字元替換,因此不能進行引數有效性的檢測。

巨集定義的返回值不能被強制轉換為可轉換的合適型別。

c++中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能用巨集定義來操作。

(1)inline函式**是被放到符號表中,使用時像巨集一樣展開,沒有呼叫的開銷,效率很高;

(2)inline函式是真正的函式,所以要進行一系列的資料型別檢查;

(3)inline函式作為類的成員函式,可以使用類的保護成員及私有成員;

(1)使用巨集定義的地方都可以使用inline函式;

(2)作為類成員介面函式來讀寫類的私有成員或者保護成員;

內聯函式以**複雜為代價,它以省去函式呼叫的開銷來提高執行效率。

一方面如果內聯函式體內**執行時間相比函式呼叫開銷較大沒有太大的意義;

另一方面每一處內聯函式的呼叫都要複製**,消耗更多的記憶體空間,因此以下情況不宜使用內聯函式:

(1)函式體內的**比較長,將導致記憶體消耗代價;

(2)函式體內有迴圈,函式執行時間要比函式呼叫開銷大;

內聯函式和巨集的區別

首先要說明的是內聯函式只在c 中有這個概念,在c語言中沒有。1.巨集的缺陷 為什麼要使用巨集呢?因為函式的呼叫必須要將程式執行的順序轉移到函式所存放在記憶體中的某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去執行前儲存現場並且記憶執行的位址,轉回後要恢復現場...

內聯函式和巨集的區別

1 替換的時機 內聯函式是在編譯期間進行替換,就是將該函式在函式的呼叫點直接展開 巨集函式是在預處理階段替換 2 替換的成功率 內聯函式只是對編譯器的乙個建議,如果編譯器覺得該函式不適合成為內聯函式時,便會忽略前面的 inline 關鍵字,比如我們將遞迴函式寫成內聯函式,編譯器會忽略前面的 inli...

巨集和內聯函式的區別

巨集和內聯函式的區別 總結 內聯函式是對巨集的優化 1 巨集 巨集常量例 deifne pi 3.14 優點 一改全改,調高 的復用性 提高效能 缺點 定義巨集出錯時,不容易定位錯誤,因為預處理階段進行了替換 展開 在c 中對巨集常量進行了優化 用const 修飾變數 同時const具有巨集常量的屬...