2012-03-30 157 views
2

我在C中使用gcc在Linux中開發。內聯函數

我安排我在.H和.C文件小功能以下列方式

 // .H file 
     extern int my_function(int val); 

     // .C file 
     inline int my_function(int val){ 
      // my job..very short! 
     } 

這些功能是小,所以他們是很好的候選人被內聯,但我不知道他們是否會是肯定的。

我對我組織我的文件的方式有懷疑,並且我在想如果將所有函數直接內聯到沒有.C文件的.h文件中會更好。 你能幫我澄清一下我的疑問嗎?

回答

3

首先,請注意,您可以通過添加-finline-functions選項來指示gcc嘗試將小函數內聯到其調用者中。

如果你有你的函數實際上將被內聯有任何疑問,你可以問GCC,要提醒你uninlinable功能,通過使用-Winline

這裏爲您的函數聲明爲externinline,他們內聯,因爲inline定義將僅用於內聯。在這種特殊情況下,函數將不會自行編譯。

閱讀http://gcc.gnu.org/onlinedocs/gcc/Inline.html瞭解更多詳情。

2

無論你的函數多麼小,選擇的是編譯器是否內聯它。

因此,即使您的函數數量非常少,並且您將它們全部嵌入代碼中,仍然無法保證所有代碼都將被編譯器內聯。

您可以在內聯here上找到一些有用的信息。

0

首先,編譯器必須能夠看到函數的定義,以便內聯它。因此,您必須將定義放在頭文件中。 (在這裏,我假設你的應用程序包含多個源文件)。注意:某些開發環境支持多文件編譯,在這種情況下,此註釋不適用。其次,如果你習慣C++(其中的東西「正常工作」),那麼內聯C99的語義有點混亂。在C99中,你必須選出一個單獨的源文件(不是頭文件),該文件擁有該函數 - 如果函數未在某個源文件中內聯,則必須存在該函數的一個明確定義。這是通過使用extern關鍵字指定功能來完成的。 (這是對extern的傳統解釋的偏離,它僅用於聲明)。

例如:

// .h file 
    inline int my_function(int val) 
    { 
     // my job..very short! 
    } 

    // In ONE .c file 
    extern int my_function(int val);