C 之函式的公升級(上)

2021-10-02 19:10:43 字數 2965 閱讀 7852

函式預設引數

函式佔位引數

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

const int a = 3; #define a 3

c++中是否有解決方案替代巨集**片段呢?(內聯函式)

替代巨集**片段就可以避免巨集的***!

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

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

#include inline int func(int a, int b)

int main()

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

例如:

#include inline int func(int a, int b);

int func(int a, int b) //這不是內斂函式

int main()

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

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

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

c++編譯器直接將函式體插入函式呼叫的地方 [ func(1,2); 1 < 2 ? 1 : 2 ]

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

tips:

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

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

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

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

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

分析:巨集的***

分析:內聯函式更安全

tips:

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

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

如:g++中的__attribute__((always_inline))屬性

從彙編**分析內聯函式

#include inline int f_inline(int a, int b) __attribute__((always_inline));

int g_no_inline(int a, int b);

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

int f_inline(int a, int b)

int g_no_inline(int a, int b)

分析:內聯函式沒有普通函式呼叫時的壓棧、跳轉等。

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

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

函式體不能過於龐大

不能對函式進行取址操作

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

tips:

編譯器對於內聯函式的限制並不是絕對的,內聯函式相對於普通函式的優勢只是省去了函式呼叫時壓棧,跳轉和返回的開銷。

因此,當函式體的執行開銷遠大於壓棧,跳轉和返回所用的開銷時,那麼內聯將無意義。

c++中可以在函式宣告時為引數提供乙個預設值,當函式呼叫時沒有指定這個引數的值,編譯器會自動用預設值代替

只有引數列表後面部分的引數才可以提供預設引數值

一旦在乙個函式呼叫中開始使用預設引數值,那麼這個引數後的所有引數都必須使用預設引數值

在c++中可以為函式提供佔位引數

佔位引數只有引數型別宣告,而沒有引數名宣告

一般情況下,在函式體內部無法使用佔位引數

#include int func(int a, int b, int)

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

可以將佔位引數與預設引數結合起來使用

意義:為以後程式的擴充套件留下線索

相容c語言程式中可能出現的不規範寫法

#include int func(int a, int b, int = 0)  //佔位引數與預設引數結合起來使用

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

C 學習筆記7 C 函式的公升級 上

1 常量與巨集回顧 c 中的const常量可以替代巨集引數定義 const int a 5 等價於 define a 5 巨集具有 那麼c 是否有方法避免呢?2 內聯函式 c 中推薦使用內聯函式代替巨集 片段 c 中inline關鍵字宣告內聯函式 inline int func int a,int ...

第三課 函式的公升級(上)

常量與巨集回顧 c 中const常量可以替代巨集常數定義,如 const int a 3 define a 3 c 中是否有解決方案替代巨集 片段呢?替代巨集片段就可以避免巨集的 內聯函式 1 c 中推薦使用內聯函式替代巨集 片段 2 c 中使用inline關鍵字宣告內聯函式 inline int ...

公升級Mac OS X上的git

開啟iterm使用命令列檢視git版本,發現居然還是mac預設的1.9.3版本 git version git version 使用命令檢視git路徑,返回結果是 usr bin git,而實際新安裝的2.10.1版本路徑是 usr local git which git usr bin git 使...