define巨集定義與inline內聯的異同

2021-08-11 05:26:07 字數 2078 閱讀 6595

二、define巨集定義與inline內聯

1、內聯函式在可讀性方面與函式是相同的,而在編譯時是將函式直接嵌入呼叫程式的主體,省去了呼叫/返回指令,這樣在執行時速度更快。

2、內聯函式可以除錯,而巨集定義是不可以除錯的。內聯函式與巨集本質上是兩個不同的概念如果程式編寫者對於既要求快速,又要求可讀的情況下,則應該將函式冠以inline。下面詳細介紹一下**一下內聯函式與巨集定義。

(1)、內聯函式是什麼?

內聯函式是**被插入到呼叫者**處的函式。如同 #define 巨集(但並不等同,原因見下文),內聯函式通過避免被呼叫的開銷來提高執行效率,尤其是它能夠通過呼叫(「過程化整合」)被編譯器優化。

(2)、 內聯函式是如何在安全和速度上取得折衷?

在 c 中,你可以通過在結構中設定乙個 void* 來得到「封裝的結構」,在這種情況下,指向實際資料的 void* 指標對於結構的使用者來說是未知的。因此結構的使用者不知道如何解釋void*指標所指內容,但是訪問函式可以將 void* 轉換成適當的隱含型別。這樣給出了封裝的一種形式。

不幸的是這樣做喪失了型別安全,並且也將繁瑣的對結構中的每個域的訪問強加於函式呼叫。(如果你允許直接訪問結構的域,那麼對任何能直接訪問的人來說,了解如何解釋 void* 指標所指內容就是必要的了;這樣將使改變底層資料結構變的困難)。

雖然函式呼叫開銷是很小的,但它會被累積。c++類允許函式呼叫以內聯展開。這樣讓你在得到封裝的安全性時,同時得到直接訪問的速度。此外,內聯函式的引數型別由編譯器檢查,這是對 c 的 #define 巨集的乙個改進。

(3)、為什麼我應該用內聯函式?而不是原來清晰的 #define 巨集? 

因為#define巨集定義函式是在四處是有害的:

和 #define 巨集不同的是,內聯函式總是對引數只精確地進行一次求值,從而避免了那聲名狼藉的巨集錯誤。換句話說,呼叫內聯函式和呼叫正規函式是等價的,差別僅僅是更快:

複製** **如下:

// 返回 i 的絕對值的巨集

#define unsafe(i) \

( (i) >= 0 ? (i) : -(i) )// 返回 i 的絕對值的內聯函式

inline

int safe(int i)

int f();

void usercode(int x)

和巨集不同的,還有內聯函式的引數型別被檢查,並且被正確地進行必要的轉換。巨集定義複雜函式是有害的;非萬不得已不要用。

(4)、如何告訴編譯器使非成員函式成為內聯函式?

宣告內聯函式看上去和普通函式非常相似:

void f(int i, char c);

當你定義乙個內聯函式時,在函式定義前加上 inline 關鍵字,並且將定義放入標頭檔案:inlinevoid f(int i, char c)

注意:將函式的定義(之間的部分)放在標頭檔案中是強制的,除非該函式僅僅被單個 .cpp 檔案使用。尤其是,如果你將內聯函式的定義放在 .cpp 檔案中並且在其他 .cpp檔案中呼叫它,聯結器將給出 「unresolved external」 錯誤。

(5)、如何告訴編譯器使乙個成員函式成為內聯函式?

宣告內聯成員函式看上去和普通函式非常類似:

class fred ;

但是當你定義內聯成員函式時,在成員函式定義前加上 inline 關鍵字,並且將定義放入標頭檔案中:inlinevoid fred::f(int i, char c)通常將函式的定義(之間的部分)放在標頭檔案中是強制的。如果你將內聯函式的定義放在 .cpp 檔案中並且在其他 .cpp 檔案中呼叫它,聯結器將給出「unresolved external」錯誤。

(6)、 有其它方法告訴編譯器使成員函式成為內聯嗎?

有:在類體內定義成員函式:class fred };儘管這對於寫類的人來說很容易,但由於它將類是「什麼」(what)和類「如何」(how)工作混在一起.小結總之,在嵌入式c(或c++)程式設計裡面,懂得使用內聯函式(inline)與巨集定義(#define),並使用好它們,對我們是大有裨益的。

define巨集定義

預處理指令 以 開頭的行,都預處理指令,用於指示編譯器做一些預處理工作。比如 include h 注 預處理指令不是語句,行尾不要加分號 define的兩種用法 1.定義乙個 數值 2.定義乙個 算式 注 工程中應該避免使用這兩種方式 定義乙個值 define pi 3.14 int main 定義...

巨集定義 define

巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串。1 define printx printf d n x 在c程式中,以 字元開頭的 都是一條c預處理器語句。預...

define巨集定義

include include define sub x,y x y define access before element,offset,value sub element,offset value using namespace std int main access before array...