C 內聯函式

2022-09-01 06:03:14 字數 1526 閱讀 2877

c++中,使用預處理巨集存在倆問題:

(1).巨集看起來像乙個函式呼叫,但不總是這樣,這樣就隱藏了難以發現的問題(這個問題在c中也存在)

(2).這個問題是c++特有的:預處理器不允許訪問類的成員資料。這意味著預處理器巨集不能用作類的成員函式。

為了保持預處理器巨集的效率又增加安全性,而且還能像一般成員函式一樣可以在類裡訪問自如,c++引入了內聯函式。

1.預處理巨集

在c語言源程式中允許用乙個識別符號來表示乙個字串, 稱為「巨集」。被定義為「巨集」的識別符號稱為「巨集名」。在編譯預處理時,對程式中所有出現的「巨集名」,都用巨集定義中的字串去代換, 這稱為「巨集代換」或「巨集展開」。

巨集定義是由源程式中的巨集定義命令完成的。 巨集代換是由預處理程式自動完成的。

巨集定義只是起到個替換功能,並不能作為函式使用,當巨集定義的字串是乙個算數表示式的時候,就要為它加括號括住,不然在呼叫它的時候會出現意想不到的錯誤。如下例:

這裡輸入的數字是2,即y=2。按照數學演算法m=y*y+3*y =2*2+3*2=10,那麼s=3*m+4*m+5*m=3*10+4*10+5*10=120。但是結果是66,為什麼呢?因為巨集執行的是替換,我們把m代表的字串y*y+3*y替換到程式中,

得到:s=3*y*y+3*y + 4*y*y+3*y  + 5*y*y+3*y。這樣的話計算結果就是上圖中的66。但是為字串加括號的話就符合我們的預期,不會出錯了。#define m (y*y+3*y),執行後:

2.內聯函式:

一般把內聯定義放在標頭檔案裡。

當編譯器看到這個定義時,它把函式型別(函式名+返回值)和函式體放到符號表裡。

使用函式時,編譯器檢查以確保函式呼叫是否正確,且返回值被正確使用,然後將函式呼叫替換為函式體,因而減小開銷。

內聯**雖然占用空間,但

如果函式較小

,這樣做卻比乙個普通函式呼叫而產生的**(引數壓棧和執行call)占用的空間還小。

定義內聯函式,使用關鍵字inline:

1.錯誤定義:

inline int function(int x);//只有函式宣告,沒有函式體
2.正確定義方法:

inline int function(int x)//函式宣告和函式體一起使用,正確。
任何在類內部定義的函式都自動的成為內聯函式。但是在類外部定義的函式想要成為內聯函式,要在函式前面加inline關鍵字使之成為內聯函式,為了使之有效,必須使函式體和宣告放在一起,否則,編譯器將它作為普通函式對待。

一般把內聯函式放在標頭檔案裡。在標頭檔案中宣告內聯函式,必須包含該函式的定義,這些定義在每個用到該函式的檔案中,不會出現多個定義錯誤的情況。

C 內聯函式

1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...

C 內聯函式

1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...

c 內聯函式

1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...