[英]inline, static, extern in C99
請不要在這里重定向到那里的答案 - 我已經閱讀了它們,以及互聯網上的其他答案,包括標准,但我仍然感到困惑(大多數情況下,我認為是因為技術詞匯,英語單詞和語言的重疊關鍵字)。
讓我在C99中直截了當地了解函數 :
static
:不產生任何外部符號
extern
(隱式):如果此轉換單元中沒有定義,則編譯器會生成在鏈接期間解析的引用
現在有了inline
。 據我所知,由於編譯器可能選擇內聯或不內聯,因此問題很復雜。
我可以通過兩種不同的方式看到這個答案:
static inline
似乎是#1的答案:
static inline
函數,那么就去做吧。 static
存儲說明符與非內聯函數的使用一致,因為不會產生外部符號。 由於這種情況,如果編譯器決定在轉換單元內的每個調用站點內聯static inline
函數,則不需要生成獨立的目標代碼。 static inline
函數,那么它可以在轉換單元內生成獨立的目標代碼,並且不會為其導出外部符號。 據我所知, extern inline
/ inline
是#2的答案:
inline
(沒有extern
或static
)的行為類似於#2。 如果編譯器實際上沒有內聯它們,那么在鏈接時需要鏈接外部實現。 extern inline
。 我認為這是最令人困惑的,因為正常函數的extern
關鍵字幾乎完全相反 它是否正確?
相關鏈接,但仍然留下模糊的角落:
您對此的總體理解是正確的。
實際導出要鏈接的符號的翻譯單元必須聲明為extern inline。 我認為這是最令人困惑的,因為正常函數的extern關鍵字幾乎完全相反
是的,這是該語言的一個不幸的部分,但你有權利。
作為一小部分瑣事(希望不會讓你感到困惑),GNU gcc 用於處理“內聯”和“外部內聯”與C99 / C11標准對待它們的方式完全相反。 在這種情況下,GNU會將“內聯”解釋為“使用此定義以內聯AND生成此函數的外部,外部可見定義”,並將“extern inline”視為“僅使用此定義進行內聯” ;如果沒有發生內聯,則發出對函數的extern引用(必須在別處定義)“。
無論出於何種原因,C99標准選擇交換“內聯”和“外部內聯”的含義,現在我們堅持使用它。
注意:快速測試表明,如果不通過-std = c99 / c11或-fno-gnu89-inline,GNU gcc v4.9.2將默認采用“GNU”方式(-fgnu89-inline)。 在那時和GNU gcc v5.2.1之間的某個時間它發生了變化,因為v5.2.1將默認為-fno-gnu89-inline(即標准的C99 / C11方式)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.