2014-03-01 37 views
0

我正在編寫設備驅動程序。我有一個問題要問:Linux設備驅動程序中的內聯函數

在.c文件中聲明內聯函數是否正確?

我說的是針對linux內核的設備驅動程序。我有一個函數,它在函數體中很短,並且從一個模塊導出到另一個模塊。你是否認爲,我可以聲明它是一個內聯的.c文件,或者我需要將這個函數聲明和EXPORT_SYMBOL行一起移動到.h文件,因爲它是內聯的?什麼是標準的Linux內核練習?

For ex -> something like this? 
inline void hello_world() 
{............ 
return; 
} 
EXPORT_SYMBOL(hello_world); 

謝謝!

+0

這比編碼約定更重要。詢問http://kernelnewbies.org。並且您的代碼將導出*非內聯*函數。 –

+0

在設備驅動程序編程的情況下,如果您有多個模塊可以調用或使用多個函數/函數,那麼您只需創建一個「.c」文件並使用EXPORT_SYMBOL_GPL將所有函數導出到內核。然後這些導出的函數被識別爲「內核符號」。在使用或調用這些導出的函數時,您不需要包含任何文件,也不需要定義其原型。只需導出它,然後從任何其他模塊調用它。但請確保您要出口的「許可證」。 –

回答

2

只要您不聲明函數爲static,即使已聲明爲inline,非內聯版本也會包含在編譯代碼中,正是爲了使其他編譯單元的代碼能夠調用該函數。

顯然,除非啓用了整體程序優化/鏈接時優化,否則從編譯單元外部調用時,不會有任何跨函數調用的優化。

+1

如果靜態內聯函數出現在內聯調用之外,它也會包含在編譯代碼中,例如,作爲函數指針。 –

+0

@BasileStarynkevitch是的,我想說的是,如果你想讓編譯器省略內聯函數(或從不調用的函數),你實際上必須爲它工作。但是,如果函數被定義爲'static',即使它沒有被優化,你也不應該從編譯單元之外調用它。 – EOF

相關問題