內聯函式與巨集的區別:
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 ...