函式預設引數
函式佔位引數
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 使...