2012-03-30 118 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);