日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++超詳細分析講解內聯函數_C 語言

作者:Bright-SKY ? 更新時間: 2022-07-31 編程語言

宏函數(帶參數的宏)的缺點

第一個問題:宏函數看起來像一個函數調用,但是會有隱藏一些難以發現的問題。

例如:

#define FUN(x, y) (x * y)
printf("%d", add(3, 3 + 2))    //3 * 3 + 2 = 11

以上情況可以通過加 “()” 解決:

#define FUN(x, y) (x * y)
printf("%d", add(3, (3 + 2)))    //3 * (3 + 2) = 15

特殊情況加()也保證不了參數的完整性:

#define GET_MAX_DATA(a, b) ((a)>(b)?(a):(b))
void test02()
{
    int a = 3;
    int b = 5;
    //((a)>(++b)?(a):(++b))  無法保證參數的完整性
    printf("最大值為:%d\n", GET_MAX_DATA(a,++b));//7
}

第二個問題是c++特有的,預處理器不允許訪問類的成員,即預處理器宏不能用作類的成員函數

內聯函數:內聯函數為了繼承宏函數的效率,沒有函數調用時開銷,然后又可以像普通函數那樣,可以進行參數,返回值類型的安全檢查,又可以作為成員函數

內聯函數:是一個真正的函數。函數的替換 發生在編譯階段

inline修飾的函數就是內聯函數

inline int myAdd(int x, int y)//inline必須出現在函數的定義處
{
    return x+y;
}

內聯函數為了繼承宏函數的效率,沒有函數調用時開銷,然后又可以像普通函數那樣,可以進行參數, 返回值類型的安全檢查,又可以作為成員函函數。

內聯函數:是在編譯階段 完成的替換。

inline int my_mul(int x,int y)
{
    return x*y;
}
void test01()
{
    cout<<"my_mul = "<<my_mul(10+10,20+20)<<endl;
}

任何在類內部定義的函數自動成為內聯函數。

內聯函數的特點

1、能保證參數的完整性

2、有作用域的限制,可以成為類的成員

3、類中的成員函數 默認都是內聯函數(不用inline)

內聯函數的要求:

不能存在任何形式的循環語句 不能存在過多的條件判斷語句 函數體不能過于龐大 不能對函數進行取地址操作。

內聯僅僅只是給編譯器一個建議。(具體處理方式由編譯器來決定)

宏函數和內聯函數的區別

宏函數:

預處理階段完成替換、沒有出入棧的開銷、不能保證參數的完整性、沒有作用域限制、不能作為類的成員

內聯函數:

編譯階段完成替換、沒有出入棧的開銷、能保證參數的完整性、有作用域限制、能作為類的成員

原文鏈接:https://blog.csdn.net/qq_34981463/article/details/124979909

欄目分類
最近更新