內聯函式與巨集定義的區別

2022-04-28 18:57:08 字數 1721 閱讀 8746

內聯函式與巨集的區別:

inline一般只用於如下情況:

(1)乙個函式不斷被重複呼叫

(2)函式只有簡單的幾行,且不包含for、while、switch等語句。

一般而言,寫小程式沒有必要使用inline,但是如果要完成乙個工程專案,當乙個簡單函式被呼叫多次時,應考慮使用inline

常用的一些巨集定義

1 防止乙個標頭檔案被重複包含

#ifndef bodydef_h 

#define bodydef_h

#endif

2 得到指定位址上的乙個位元組或字

#define mem_b( x ) ( *( (byte *) (x) ) ) 

#define mem_w( x ) ( *( (word *) (x) ) )

用法如下:

#include #include 

#define mem_b(x) (*((byte*)(x)))

#define mem_w(x) (*((word*)(x)))

intmain()

3 得到乙個field在結構體(struct)中的偏移量

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

4 得到乙個結構體中field所占用的位元組數 

#define fsiz( type, field ) sizeof( ((type *) 0)->field )

5 得到乙個變數的位址(word寬度)

#define b_ptr( var ) ( (byte *) (void *) &(var) ) 

#define w_ptr( var ) ( (word *) (void *) &(var) )

6 將乙個字母轉換為大寫

#define upcase( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )

7 判斷字元是不是10進值的數字

#define upcase( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )

8 判斷字元是不是16進值的數字

#define hexchk( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''a'' && (c) <= ''f'') ||((c) >= ''a'' && (c) <= ''f'') )

9 防止溢位的乙個方法

#define inc_sat( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

10 返回陣列元素的個數

#define arr_size( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

內聯函式與巨集定義區別

內聯函式和普通函式相比可以加快程式的執行效率,因為它不需要中斷呼叫,在編譯的時候內聯函式可以直接被鑲嵌到目標 中。而巨集只是在預處理階段乙個簡單的字元替換。內聯函式需要做型別檢查,這是相比巨集的乙個優勢。巨集是在 處不加任何驗證的簡單替代,而內聯函式是將 直接插入呼叫處,而減少了普通函式呼叫時的資源...

C 內聯函式與巨集定義的區別

c primer 5th editon p213 消除 函式呼叫 執行時開銷 內聯函式與巨集定義的區別 內聯函式在執行時可除錯,而巨集定義不可以 編譯器會對內聯函式的引數型別做安全檢查或自動型別轉換 同普通函式 而巨集定義則不會 內聯函式可以訪問類的成員變數,巨集定義則不能 在類中宣告同時定義的成員...

內聯函式與巨集定義

用內聯取代巨集 1.內聯可除錯 2.可進行型別安全檢查或自動型別轉換 3.可訪問成員變數。另外,定義在類宣告中的成員函式自動轉化為內聯函式。內聯函式與巨集定義 在c中,常用預處理語句 define來代替乙個函式定義。例如 define max a,b a b a b 該語句使得程式中每個出現max ...