C中 define和inline的區別

2021-06-20 14:58:12 字數 1592 閱讀 4993

c中巨集定義和內聯函式的區別是很容易讓人忽視的乙個地方,也是面試的時候經常被提起的乙個問題。前幾天寫**的時候由於對巨集定義乙個細節的忽視,導致程式執行總是出錯。現在把巨集定義可能出現的問題總結一下。

出錯的**結構如下:

[cpp]view plain

copy

if(rlc_dc_bit_msk == data_or_control)  

log_info(...);  

else

}  當第乙個if條件判斷為假時,程式並不會執行else分支。這是為什麼呢?

檢視log_info()的巨集定義:

[cpp]view plain

copy

#define log_info(...) \

if(getlogoutswitch(sp_log_info_level, sessionid)) \  

if(type == asn1) \  

sendlog(...); \  

else

\  sendlog(...)  

根據c語言的編譯規則,else分支和log_info()中的if進行了匹配,導致程式並沒有進else分支執行。

define成為「巨集」,在c語言程式設計中非常重要,它在程式編譯時只是在預處理的過程中實施簡單的替換操作而已,但是在替換過程中可能出現各種不安全性問題,不進行引數有效性檢查。

內聯函式和普通函式相比可以加快程式的執行速度,但它是以增加程式儲存空間為代價的,由於不需要中斷呼叫,在編譯內聯函式的時候內聯函式可以直接被嵌入目標**中。

對於短小的**,inline可以帶來一定效率的提公升,且與c時代的define(巨集)相比,它更安全可靠。巨集和內聯函式的主要區別如下:

1. 巨集是**處不加任何驗證的簡單替代,而內聯函式是將**直接插入呼叫處,而減少了普通函式呼叫時的資源消耗。

2. 巨集不是函式,只是在編譯前預處理階段將程式中有關字串替換成巨集體。

3. inline是函式,但在編譯中不單獨產生**,而是將有關**嵌入到呼叫處。

總結如下:

對於一般常量,最好用const和enum替換#define;

對於類似函式的巨集,最好改用inline函式替換#define。

兩個例子:

1.[cpp]view plain

copy

#define max(a, b) ((a) > (b) ? (a):(b)) /* 得到兩個數中的最大值 */

inta = 5, b = 0;  

max(++a, b); /* a會被遞增兩次,最終返回結果是7 */ 2.

[cpp]view plain

copy

#define abc(x)  (x*x)

__inline int

abc(

const

intx)     

printf("%d\n"

, abc(1+1));   

/* 3 */

printf("%d\n"

, abc(1+1));   

/* 4 */

inline和define的特點和區別

一 內聯函式inline 函式呼叫時都會產生一些額外的開銷,主要是系統棧的保護 的傳遞 系統棧的恢復以及引數傳遞等。對於那些函式體很小 執行時間很短但又頻繁使用的函式,定義為內聯函式提高函式呼叫的效率。內聯函式不是在呼叫時發生轉移,而是在編譯時將函式體嵌入到每個內聯函式呼叫處。這樣就省去了引數傳遞 ...

inline函式和 define巨集定義簡單講解

在c語言,實際上inline的出現是為了填補巨集定義的缺點。巨集定義是在編譯器預編譯的時候把define定義的關鍵字進行替換。用巨集定義的好處是巨集定義在形式及使用上像乙個函式,但它使用預處理器實現,沒有了引數壓棧,生成等一系列的操作。因此,效率很高,這是它在c中被使用的乙個主要原因。1 inlin...

c 中define與inline的一些注意事項

巨集不會被編譯,因為在原始碼進入編譯器之前,他會被預處理器去掉,因此盡量用const代替。巨集不是函式,只是在編譯前預處理階段將程式中有關字串替換成巨集體。因此要注意下列 中的問題 int a 5,b 0 max a,b a 的值增加了2次 max a,b 10 a 的值只增加了1次 相比之下內聯函...