2020/11/25更新:
這篇對一半吧,
這篇比較完整,也比較正確
忘記在哪時候看到這篇(我有所不知的 static inline function),讀完覺得頗有趣的,來記錄一下。
這篇是靠感覺打的,沒有實作跟去check組合語言,因為我覺得觀念對了,真的有不確定的地方再試就好。
static
static
代表符號只在這個編譯單元有效,編譯單元就是一個.c檔在預處理器處理之後的東東(include, define那些被展開之後)。
inline
inline
則是建議編譯器可以把函式內嵌在呼叫的地方,節省資源提升速度。
那幹嘛要寫在一起勒
其實可以反過來想,如果不一起寫,只寫inline
,會怎樣?
好,現在編譯器看到一個inline
函式,它會想:
哦哦寫code的人建議
inline
,ㄟ但他不是static
耶,這樣行不通啊,如果有其他編譯單元宣告了這個函式,想要鏈接怎麼辦?
哎沒辦法,只好放棄inline
了,把這個函式獨立編譯吧
上面那樣寫可能看不懂,來想想一個狀況:
1 | /* foo.c */ |
1 | /* main.c */ |
因為foo()
沒有static
,main.c是可以宣告並使用foo.c的foo()
的,而且可以獨立編譯main.c和foo.c:
1 | $ gcc -c main.c -o main.o |
在獨立編譯main.c時,根本就沒有foo()
的定義啊,所以也就不可能可以內嵌。
不過,如果是加了static
,那麼就不會出現其他編譯單元宣告foo.c的foo()
並獨自編譯的狀況,也就能順利內嵌函式了。