我找到static inline
函數Bionic
libc
(stdlib.h
)。libc中的靜態內聯函數
我想編譯一個文件,但不包括stdlib.h
。
作爲例子: 測試文件:
extern int test(void)
void foo() {
int a = test();
}
int main() {
foo();
return 0;
}
爲什麼需要包括頭文件用於使用其定義爲static inline
功能?
我找到static inline
函數Bionic
libc
(stdlib.h
)。libc中的靜態內聯函數
我想編譯一個文件,但不包括stdlib.h
。
作爲例子: 測試文件:
extern int test(void)
void foo() {
int a = test();
}
int main() {
foo();
return 0;
}
爲什麼需要包括頭文件用於使用其定義爲static inline
功能?
當一個函數內聯和靜態的,如果對該函數的所有調用都集成到調用,而該函數的地址從來沒有使用過,那麼該函數自身的彙編代碼是永遠引用。 在這種情況下,除非您指定選項-fkeep-inline-functions,否則GCC實際上不會爲該函數輸出彙編代碼。由於各種原因,某些調用不能被集成(特別是,函數定義之前的調用不能被集成,也不能在定義中進行遞歸調用)。如果存在非集成調用,那麼該函數將像往常一樣編譯爲彙編代碼。如果程序引用了其地址,則該函數也必須照常編譯,因爲該函數不能內聯。
因此,如果YOUT不包括stdlib.h中,沒有代碼的鏈接可以用它來對抗符號test()
鏈接,因爲實際上沒有這樣的功能。 但是,雖然您的程序將編譯並運行,如果test()
不是inline
您應該始終包含適當的頭文件,因爲這允許編譯器檢查返回值和paraemeter類型。
extern int test(void);
void foo() {
int a = test();
}
int main() {
foo();
return 0;
}
extern是一個外部變量,是一個在任何功能塊外定義的變量。 所以,編譯器會找到這個函數。 如果你不包括這個文件,編譯器找不到它。
儘管這個問題有一個公認的答案,我想放一些更深入的理解問題並清除一些疑惑: -
根據C99標準(§6.2.2#3)
如果一個對象的一個文件範圍標識符或 函數的聲明包含存儲類說明靜態,所述 標識符具有內部連接。
帶有內部連接的功能僅在一個翻譯單元內可見。 鏈接器從來不會聽到有內部鏈接的函數,所以它對它們一無所知。簡而言之,鏈接器不可見內部鏈接的函數或變量。到目前爲止,你一定明白了爲什麼我們必須包含頭文件。
不要忘記檢查c標準文檔。
但是,如果庫中的函數不是'static inline'(只是'int'),那麼在沒有包含頭文件的情況下,一切正常。 – Arseniy