內聯函式與巨集替換的區別

2021-08-09 23:27:45 字數 1818 閱讀 3771

1)內聯函式在執行時可除錯,而巨集不可以

2)內聯函式可以訪問類的成員變數,而巨集不可以

3)在類中宣告同時定義的簡單的函式,會自動轉換為內聯函式

4)編譯器會對內聯函式的引數型別做安全檢查

:內聯函式具有巨集的替換效果,以及普通函式的安全檢查

#define max(a,b) ((a) > (b) ?(a) :(b))    //一定要帶括號,優先順序不同會造成意想不到的結果

int a=1,b=0;

max(a++,b);    ->        ->    

等價:if(a++ > b)

return a++;

else

return b;

最後:max=2;

a=3;

max(a++,b+10);    ->        ->

等價:if(a++ > b+10)

return a++;

else

return b+10;

最後:b的值一直不變,最後加10等於10;

max(a,"hello");    -> 編譯不通過

#define f(x)  (x+x)

int x=1;

f(x++);

等價:(x++) + (x++) -> return x+x=2

x=3f(++x);

等價:(++x) + (++x) -> return 3+3=6

x=3int x=5;

( (x++) + (++x) + (++x) ) = 21;

x=8;

【問題】:c語言巨集定義#define max(a,b) a>b?a:b 有什麼隱患?

因為巨集定義是在預編譯階段把巨集的內容拷貝的源**的相應位置

如果#define max(a,b) a>b?a:b這樣寫的話

那麼如下表示式 max(a,b)+1就展開為

a>b?a:b+1

冒號後面就是b+1了,自然和lz的當初願望,算完max再加一違背了

所以要加上括號。

內聯函式中如果複雜操作,將不被內聯,如迴圈,遞迴。

inline應該放在函式定義處,不要放在宣告前.

inline  是用以實現的關鍵字,

不是用以宣告的關鍵字.

總結:巨集替換有很多意想不到的錯誤,當要實現的東西較為複雜時,建議使用函式。

知識擴充套件:

int main()

) printf("result=%d\n", result);

}

()是乙個表示式,逗號表示式類似,但是功能更強,()中可以包含有多條語句(可以是變數定義、複雜的控制語句),該表示式的值為statement list中最後一條語句的值

typeof(expression)用來獲取expression的型別

gcc選項-ansi指示編譯器編譯符合標準的程式,但是不限制其它方式,只要它與標準不衝突。這樣,asm、typeof、inline都將無效,但是__asm__、__typeof__、__inline__還將有效。

經常與-ansi一起使用的是-pedantic選項,它嚴格按照iso標準產生需要的警告資訊,但是如果程式中使用了__extension__,則-pedantic選項對__extension__後的表示式無影響。

如果要非常嚴格,可以使用-pedantic-errors選項。這樣,所有與標準不符和的**統統被編譯器當成是錯誤而不是警告。

所以:

#define min(x,y) \

()

這樣巨集定義,就不會出現x++,這種被執行多次的情況了.(這裡是用新的變數_x去替換,而不是用複雜的表示式替換)

c 巨集替換與內聯函式的區別

includeusing namespace std define myfunc a,b a b a b inline int myfunc int a,int b int main 內聯函式執行結果 巨集替換執行結果 通過了解內聯函式的內部機制後,很自然會想到同樣是 的替換,那麼內聯函式的替換與巨...

內聯函式 巨集替換

傳智掃地僧課程學習筆記。inline int myfunc int a,int b 內聯函式的實現和宣告必須在一起!你可以簡單的理解為,內聯函式和巨集替換類似,也因此沒有真正函式的壓棧,出棧,適合短小的函式,內聯是一種請求,編譯器不一定就這麼處理,內聯的限制 不能有迴圈語句,不能有過多的條件判斷,下...

巨集與內聯函式的區別

總結目的 本人曾經一度選擇放棄開發崗位,然後僅僅三個月之後又覺得自己的選擇是錯誤的,還是應該繼續自己比較擅長的開發,然而一次面試卻讓我發現,很小的知識點已經遺忘。1 巨集只做簡單的字串替換,函式是引數傳遞,所以必然有引數型別檢查 支援各種型別,而不是只有字串 2 巨集不經計算而直接替換引數,函式呼叫...