首頁 > 軟體

C++宏函數和行內函式的使用

2022-07-04 18:07:03

1. 宏常數&宏函數

1.1 定義

// a. 定義一個宏常數
#define MAX 1024 // 宏常數  MAX稱為符號常數

// b. 定義一個宏函數
// 宏函數:宏函數就是使用宏定義定義出來的函數,並不是真正意義上的函數。
#define GETSUM(x, y) ((x) + (y)) // 宏函數

1.2 使用宏函數的注意事項

  • 要保證運算的完整性;
  • 宏函數的使用場景:頻繁呼叫和短小的函數,封裝成宏函數;
  • 使用宏函數的優點:以空間換時間;

2. 行內函式

2.1 定義

行內函式,C++獨有;

​ 行內函式本質也是一個普通的函數,解決了宏函數的缺陷;

// 行內函式在函數宣告和函數定義上都要加上inline關鍵字。
inline int fun();
inline int fun()
{
        cout << "fun..." << endl;
}

2.2 某些情況編譯器不會做內聯編譯

  • 不能存在任何形式的迴圈語句
  • 不能存在過多的條件判斷語句
  • 函數體不能過於龐大
  • 不能對函數進行取地址的操作

3. 補充

3.1 宏定義和函數的區別

  • 宏在預處理階段完成替換,之後被替換的文字參與編譯,相當於直接插入了程式碼,執行時不存在函數呼叫,執行起來更快;函數呼叫在執行時需要跳轉到具體呼叫函數;
  • 宏定義屬於在結構中插入程式碼,沒有返回值;函數呼叫具有返回值;
  • 宏定義引數沒有型別,不進行型別檢查;函數引數具有型別,需要檢查型別;
  • 宏定義不要在最後加分號;

3.2 宏定義和typedef的區別

  • 宏主要用於定義常數及書寫複雜的內容;typedef主要用於定義型別別名;
  • 宏替換髮生在預編譯階段之前,屬於文字插入替換;typedef是編譯的一部分;
  • 宏不檢查型別;typedef會檢查資料型別;
  • 宏不是語句,不在在最後加分號;typedef是語句,要加分號標識結束;
  • 注意對指標的操作,typedef char * p_char和#define p_char char *區別巨大;

3.3 宏函數和行內函式的區別

  • 在使用時,宏只做簡單字串替換(編譯前)。而行內函式可以進行引數型別檢查(編譯時),且具有返回值;
  • 行內函式在編譯時直接將函數程式碼嵌入到目的碼中,省去函數呼叫的開銷來提高執行效率,並且進行引數型別檢查,具有返回值,可以實現過載;
  • 宏定義時要注意書寫(引數要括起來)否則容易出現歧義(保證運算的完整性),行內函式不會產生歧義;
  • 行內函式有型別檢測、語法判斷等功能,而宏沒有;

3.4 define宏定義和const的區別

  • 處理階段:define是在編譯的預處理階段起作用,而const是在編譯、執行的時候起作用;
  • 安全性:
    • define只做替換,不做型別檢查和計算,也不求解,容易產生錯誤,一般最好加上一個大括號包含住全部的內容,要不然很容易出錯;
    • const常數有資料型別,編譯器可以對其進行型別安全檢查;
  • 記憶體佔用
    • define只是將宏名稱進行替換,在記憶體中會產生多分相同的備份。const在程式執行中只有一份備份,且可以執行常數摺疊,能將複雜的的表示式計算出結果放入常數表
    • 宏定義的資料沒有分配記憶體空間,只是插入替換掉;const定義的變數只是值不能改變,但要分配記憶體空間。

 到此這篇關於C++宏函數和行內函式的使用的文章就介紹到這了,更多相關C++宏函數和行內函式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com