c 內聯函式,函式預設引數,佔位引數 一 3

2021-06-21 06:32:59 字數 1650 閱讀 9852

------/內聯函式

c++推薦使用內聯函式替代巨集**片段,inline必須與函式定義放一起

c++編譯器可將某函式內聯編譯,被內聯編譯的函式稱內聯函式,最終生成的**無內聯函式的定義,編譯器直接將函式體插入函式呼叫的地方,內聯函式無普通函式呼叫時的額外開銷(壓棧,跳轉,返回),編譯器不一定准許函式的內聯請求

內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等),內聯函式由編譯器處理,直接將編譯後的函式體插入呼叫的地方

巨集**片段由預處理器處理,為簡單文字替換,無編譯過程

現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能被編譯為內聯編譯,另外一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯

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

g++

-s 檔名

//單步編譯為彙編檔案

inline int f_inline(int a, int b)

//並未使其成為內聯函式

int f_inline(int a, int b) __attribute__((always_inline));

//成為內聯函式

inline int f_inline(int a, int b)

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

不能存在任何形式迴圈語句,不能存在過多條件判斷語句,函式體不能過於龐大,不能對函式名進行取址操作,否則均拒絕內聯編譯

編譯器對於內聯函式的限制並非絕對,內聯函式相對於普通函式優勢僅省去了函式呼叫時壓棧、跳轉和返回的開銷,因此當函式體執行開銷遠大於壓棧等開銷時,內聯將無意義

------/函式預設引數

c++中可在函式宣告時為引數提供一預設值,當函式呼叫時沒指定該引數的值,則編譯器用預設值代替

int mul(int x = 3);

int mul(int x)

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

一旦呼叫開始使用預設引數值,則該引數後所有引數都須使用預設引數值(對應)

int add(int a, int b = 0, int c=0)

int main(int argc, char *argv)

------/函式佔位引數

在c++中可為函式提供佔位引數,佔位引數只有型別宣告,而無引數名,在函式體內部也無法使用佔位引數

int func(int a, int b, int)

printf("func(1, 2, 3) = %d\n", func(1, 2, 3));

//3可以將佔位引數與預設引數結合起來使用,為以後程式擴充套件留下線索

int func(int a, int b, int = 0)

printf("func(1, 2, 3) = %d\n", func(1, 2,3));

------/總結

c++中可通過inline宣告內聯函式

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

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

內聯函式省去了普通函式呼叫時壓棧、跳轉和返回等開銷

c++在宣告函式時可指定引數預設值

c++可宣告佔位符引數,佔位符引數一般用於程式擴充套件和對c**的相容

C 函式的預設引數和佔位引數

預設引數 引數的預設值,定義乙個函式,可以為引數列表中每乙個引數指定預設值。當呼叫函式時,如果實際引數的值留空,則使用這個預設值,需要注意的是不可以跳過預設引數,因為是位置引數。預設引數後的所有引數都必須設定預設值。函式宣告和函式定義分開寫時 不能同時設定預設引數 分檔案時,定義處的預設引數無效,僅...

C 內聯函式 函式過載與函式預設引數

inline int max int a,int b int max double f1,double f2 int max int n1,int n2 int max int n1,int n2,int n3 max 3.4,2.5 呼叫 1 max 2,4 呼叫 2 max 1,2,3 呼叫 3...

Day13 預設函式引數,佔位引數,函式過載

day13.2021.11.23 一旦開始有預設值,後面必須都要有預設值 include methodstate.h int func int a,int b 20,int c 30 一旦開始有預設值,後面必須都要有預設值 int func int a,int b 20,int c c 必須賦值 i...