C 程式設計基礎(4)巨集定義和內聯

2021-09-20 08:19:58 字數 1793 閱讀 8147

(1)不帶引數的巨集定義

1

#define error_message -100

2#define seconds_per_day 60*60*60

(2)帶引數巨集定義,這種形式稱為巨集函式,但其實並不是函式

#define outputint(x) cout<<"int:"<#define outputchar cout<<"char:"《巨集定義是在預處理階段進行巨集展開的,但是經常會出現一些意想不到的錯誤,故出現內聯函式,內聯函式既發揮了巨集定義的優勢,又彌補了其缺點。

內聯函式是在定義時在函式最前面加上inline,或者將函式宣告的同時進行定義(這種方式不推薦)。

下面是乙個內聯函式的例子:

1class

rectangle //

直接在宣告時定義函式,形成內聯函式

6private:7

intlength;

8int

width;9};

1011 rectangle::rectangle(int l,int

w):length(l),width(w){}

12 inline int rectangle::getsquare()

相同點:二者都能夠節省頻繁的函式呼叫過程中所產生的時間和空間消耗,提高執行的效率;二者都是哦談過將函式呼叫替換成完整的函式體,二者的實現也類似。

區別:(1)二者的根本區別在於巨集定義僅僅是字串的替換,並不是函式,而內聯函式是函式。

(2)二者的**展開發生在不同階段,巨集定義是在預處理階段展開的,而內聯函式是在編譯階段展開的。

(3)內聯函式作為類的成員函式時,可以訪問類的所有成員,包括公有、私有、保護成員,隱式使用this指標,而巨集定義無法實現這些功能。

(4)內聯函式可以完全替代巨集定義,故盡量少使用巨集定義。

(5)另外在使用內聯函式時要注意**膨脹問題,內聯函式應該盡量簡短(另外現在編譯器一般都有優化功能,當檢測到內聯函式**很長時,不會進行內聯,即使使用了內聯函式)。

指出下面程式中巨集定義的錯誤並修改

1

#define max(a,b) a>b?a:b

2#define mul(a,b) a*b

3int main(int argc, char *ar**)

知識點:巨集定義自身缺陷主要是巨集展開之後,由於運算子的優先順序等原因,使得巨集定義展開後的語義和預想的發生偏差。

以下時兩個巨集展開出錯的例子

1

int product=mul(x,y+3)2

int max=max(x,y)+234

//本意是

5int product=x*(y+3)6

int max=(x>y?x:y)+27//

實際巨集展開變成了

8int product=x*y+3

9int max=x>y?x:y+2

解決辦法包括以下兩點:

(1)給引數自身加上括號

(2)給整個巨集定義加上括號

其修改結果如下:

#define max(a,b) ((a)>(b)?(a):(b))

#define mul(a,b) ((a)*(b))

下列關於內聯函式描述錯誤的是

(a)內聯函式可以被過載;

(b)建構函式可以被定義成內聯函式;

(c)內聯函式能夠減少函式呼叫的開銷;

(d)內聯函式應該在函式宣告時使用inline關鍵字

答案:d,一定要在定義時使用inline,在宣告時使用不會起到任何作用。

C 內聯函式和巨集定義

預備知識 c c 編譯過程 step1 預處理 由預處理器 乙個簡單的程式 將程式設計師通過預處理器指令 參考部落格 c c 預處理器指令c c 預處理指令 定義好的模式代替源 中的模式。step2 第一遍編譯 對預處理過的 進行語法分析,編譯器把源 分解成小的單元並把它們按樹形結構組織起來。比如表...

內聯函式和巨集定義

在c中,我們常用巨集定義來達到優化速度的目的,但由於巨集定義的種種缺陷 大家應該都吃過這種苦吧 在c 中引入了內聯函式。內聯函式實現了巨集的概念,任何在類內定義的函式會自動的成為內聯函式,但是也可以在類外用inline關鍵字來定義內聯函式。內聯的目的和巨集一樣是為了減少函式呼叫的開銷,但是通常我們會...

巨集定義和內聯函式

巨集定義和內聯函式,都可以減少函式的呼叫開銷,每次呼叫函式不必壓棧和開闢新的空間。使用巨集定義和內聯函式 的執行效率高。它們的區別是 1 巨集定義是預編譯器載入,而內聯函式是由編譯器載入 2 巨集定義容易產生一些錯誤,define min x x x min 1 3 得到的結果不是我們想要的16,而...