就按 預處理 編譯 匯編 鏈接 四個步驟來說吧,
宏函式/宏定義的替換是發生在預處理,而行內函式并不是,我在網上查到的是,編譯器會選擇性展開。
那么當編譯器展開行內函式的時候,難道是在鏈接這一步么?
這時候展開inline函式,如果該inline函式是在別的頭檔案定義的,那么呼叫過來時候,也需要鏈接其他的檔案。
我知道普通函式呼叫開銷,匯編是會看到有入堆疊出堆疊什么的。那么行內函式在鏈接時候替換,不會有這種操作么?
還有個問題,普通函式不會替換,是在代碼運行到這里的時候呼叫該函式,那么相當于只是在鏈接階段鏈接一個符號表,在使用時候再去有這個函式的.o去尋找是么?
uj5u.com熱心網友回復:
編譯的時候就展開了,跟宏一樣展開,只是inline函式展開也會做引數檢查什么的。uj5u.com熱心網友回復:
行內函式與宏定義區別(1)行內函式在編譯時展開,宏在預編譯時展開;
(2)行內函式直接嵌入到目標代碼中,宏是簡單的做文本替換;
(3)行內函式有型別檢測、語法判斷等功能,而宏沒有;
(4)inline函式是函式,宏不是;
(5)宏定義時要注意書寫(引數要括起來)否則容易出現歧義,行內函式不會產生歧義;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45980.html
標籤:C語言
上一篇:初學C,關于dev-c++的問題,你最強了,救救孩子吧
下一篇:求大佬指點迷津
