在C99中,沒有“靜態”或“外部”的“內聯”有用嗎?當我試圖構建這個代碼inline void f() {}int main(){
f();}使用命令行gcc -std=c99 -o a a.c我得到一個鏈接器錯誤(未定義的引用f)。如果我使用static inline或extern inline而不是僅僅inline,或者如果我用-O(因此函數實際上是內聯的)?!癈99標準”第6.7.4(6)段似乎界定了這種行為:如果翻譯單元中的函數的所有文件范圍聲明都包括inline無函數說明符extern,則該翻譯單元中的定義是內聯定義。內聯定義不提供函數的外部定義,也不禁止在另一個翻譯單元中進行外部定義。內聯定義提供了外部定義的替代方案,譯者可以使用該定義來實現對同一翻譯單元中的函數的任何調用。未指定對函數的調用是使用內聯定義還是使用外部定義。如果我正確地理解了所有這些,那么定義了一個具有函數的編譯單元。inline正如上面的示例所示,只有當有一個具有相同名稱的外部函數時,才會進行一致的編譯,而且我永遠也不知道是調用了我自己的函數還是調用了外部函數。這種行為不是完全愚蠢嗎?定義函數有用嗎?inline無static或extern在C99?我是不是遺漏了什么?答案摘要當然,我漏掉了什么,而且我的行為也不愚蠢。*)如尼莫解釋,想法是把定義職能inline void f() {}在頭文件中,并且只有聲明extern inline void f();在相應的.c文件中。只有extern聲明觸發外部可見二進制代碼的生成。確實沒有用inline在.C文件中-它只在頭文件中有用。就像喬納森答覆中引述的C99委員會的理據說明,inline都是關于編譯器優化,這些優化要求函數的定義在調用的站點上可見。這只能通過將定義放在標頭中才能實現,當然,頭中的定義不能在編譯器每次看到它時發出代碼。但是,由于編譯器并不強制實際內聯一個函數,所以外部定義必須存在于某個地方。
3 回答

拉風的咖菲貓
TA貢獻1995條經驗 獲得超2個贊
內聯定義提供了 替代外部定義,哪一位翻譯 可以,可能用于實現對同一翻譯單元中的函數的任何調用。
f
- 3 回答
- 0 關注
- 408 瀏覽
添加回答
舉報
0/150
提交
取消