2013-07-17 83 views
0

我找到static inline函數Bioniclibcstdlib.h)。libc中的靜態內聯函數

我想編譯一個文件,但不包括stdlib.h

作爲例子: 測試文件:

extern int test(void) 
void foo() { 
    int a = test(); 
} 

int main() { 
    foo(); 
    return 0; 
} 

爲什麼需要包括頭文件用於使用其定義爲static inline功能?

回答

1

Using the GNU compiler

當一個函數內聯和靜態的,如果對該函數的所有調用都集成到調用,而該函數的地址從來沒有使用過,那麼該函數自身的彙編代碼是永遠引用。 在這種情況下,除非您指定選項-fkeep-inline-functions,否則GCC實際上不會爲該函數輸出彙編代碼。由於各種原因,某些調用不能被集成(特別是,函數定義之前的調用不能被集成,也不能在定義中進行遞歸調用)。如果存在非集成調用,那麼該函數將像往常一樣編譯爲彙編代碼。如果程序引用了其地址,則該函數也必須照常編譯,因爲該函數不能內聯。

因此,如果YOUT不包括stdlib.h中,沒有代碼的鏈接可以用它來對抗符號test()鏈接,因爲實際上沒有這樣的功能。 但是,雖然您的程序將編譯並運行,如果test()不是inline您應該始終包含適當的頭文件,因爲這允許編譯器檢查返回值和paraemeter類型。

0
extern int test(void); 
void foo() { 
    int a = test(); 
} 

int main() { 
    foo(); 
    return 0; 
} 

extern是一個外部變量,是一個在任何功能塊外定義的變量。 所以,編譯器會找到這個函數。 如果你不包括這個文件,編譯器找不到它。

+0

但是,如果庫中的函數不是'static inline'(只是'int'),那麼在沒有包含頭文件的情況下,一切正常。 – Arseniy

0

儘管這個問題有一個公認的答案,我想放一些更深入的理解問題並清除一些疑惑: -

根據C99標準(§6.2.2#3)

如果一個對象的一個​​文件範圍標識符或 函數的聲明包含存儲類說明靜態,所述 標識符具有內部連接

帶有內部連接的功能僅在一個翻譯單元內可見。 鏈接器從來不會聽到有內部鏈接的函數,所以它對它們一無所知。簡而言之,鏈接器不可見內部鏈接的函數或變量。到目前爲止,你一定明白了爲什麼我們必須包含頭文件。

不要忘記檢查c標準文檔。