C 基礎 內聯函式

2021-09-27 13:22:25 字數 1554 閱讀 7198

c++中的const常量可以替代巨集常數定義,如:

const

int a =3;

#define a 3

c++中是否有解決方案替代巨集**片段呢?(替代巨集**片段就可以避免巨集的***!)

c++中推薦使用內聯函式替代巨集**片段

c++中使用inline關鍵字宣告內聯函式

內聯函式宣告時inline關鍵字必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。

//巨集替換和函式呼叫區別

#include

"iostream"

using

namespace std;

//必須inline int myfunc(int a, int b)和函式體的實現,寫在一塊

//不能單獨 inline void printa();

inline

void

printa()

void

main1401()

//帶引數的巨集

#define myfunc(a, b) ((a) < (b) ? (a) : (b))

inline

intmyfunc

(int a,

int b)

intmain402()

1. 必須inline int myfunc(int a, int b)和函式體的實現,寫在一塊

2. c++編譯器可以將乙個函式進行內聯編譯

被c++編譯器內聯編譯的函式叫做內聯函式

內聯函式在最終生成的**中是沒有定義的

3. c++編譯器直接將函式體插入在函式呼叫的地方

內聯函式沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)

4. c++編譯器不一定准許函式的內聯請求!

5. 內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等)

內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求

內聯函式由 編譯器處理,直接將編譯後的函式體插入呼叫的地方

巨集**片段 由預處理器處理, 進行簡單的文字替換,沒有任何編譯過程

6. 現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能被編譯器內聯編譯

另外,一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯

7.c++中內聯編譯的限制:

不能存在任何形式的迴圈語句

不能存在過多的條件判斷語句

函式體不能過於龐大

不能對函式進行取址操作

函式內聯宣告必須在呼叫語句之前

1)內聯函式在編譯時直接將函式體插入函式呼叫的地方

2)inline只是一種請求,編譯器不一定允許這種請求

3)內聯函式省去了普通函式呼叫時壓棧,跳轉和返回的開銷

C 基礎 this指標 內聯函式

本文學習this指標 inline內聯函式 this指標原理 this指標的使用 class a private inline內聯函式的分類 內聯函式主要分為兩種 類內內聯函式 類外全域性內聯函式 類內 見上面的例子 不用顯示的去宣告 類外 class a inline int a minus in...

C 基礎之函式過載和內聯函式

c 有別於 c 比較重要的就是其抽象 封裝 繼承和多型等特性。多型又具體地體現在過載 虛函式和模板等之上。今天就和大家聊一聊函式過載和內聯函式。所謂的函式過載,就是說我們可以定義不同功能的同名函式,它們傳入引數型別是不一樣的,當你呼叫這個函式名的時候,編譯器會根據你給的引數型別,去匹配和呼叫相對於的...

C 內聯函式

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