2017-07-08 24 views
3

我看到這個例子,我有一個crc32.c文件,其中包含:在C文件中只有一個內聯函數是否相關?

inline int32_t crc32_compute(int32_t *buffer, size_t size) { 
    ... 
} 

在頭文件中我發現:

extern inline int32_t crc32_compute(int32_t *buffer, size_t size); 

對我來說,inline關鍵字沒有作用,因爲該功能應該是在頭文件中聲明不在C文件中。這是否正確?

+0

@dasblinkenlight添加到我的答案 – nowox

回答

6

你是對的,不管是誰寫這段代碼都是錯誤的。頭文件應該包含inline功能,憑藉其完整的定義一起,而.c文件應包含extern inline聲明,沒有一個定義:

頁眉:

inline int32_t crc32_compute(int32_t *buffer, size_t size) { 
    ... 
} 

C文件:

extern inline int32_t crc32_compute(int32_t *buffer, size_t size); 

標題將允許功能代碼被內聯; .c文件將指示編譯器爲它發出一個外部可見的符號。

1

他們忘了一個神奇的靜態詞。現在,如果由gcc編譯,它將被忽略,編譯器將決定是否以及如何實現此功能。無論如何,即使沒有內聯關鍵字,編譯器(和鏈接器,如果鏈接時間優化打開)決定如何實現函數調用 - 通過內聯或傳統調用。

如果你想確保函數是內聯的,你應該使用正確的編譯器屬性或編譯指示。

在哪裏放置以及如何聲明內聯函數取決於編譯器,優化,鏈接時間優化和其他因素。

回答你的問題,如果函數應該只在特定的.c文件的範圍內可見 - 是的 - 但沒有static關鍵字,它也將被放置在目標文件中。

+0

'static'語句要求該函數僅用於'crc32.c'文件,但該文件旨在用於外部,因此它將永遠不會內聯,因爲內聯是由編譯器而不是鏈接器完成的。正確? – nowox

+1

是和不是在同一時間。現在的情況要複雜得多。現代連接器也可以進行鏈接時間優化(它不再是編譯器的領域)。這個問題沒有簡單的答案。你必須參考你的編譯器/鏈接器文檔。對於海灣合作委員會https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Inline.html#Inline –

+0

你能提供一個工作的例子嗎?您提供的鏈接未顯示內聯在鏈接階段完成。 – nowox

相關問題