2

我正在使用 Linux 中的 gcc 在 C 中进行开发。

我正在按以下方式在 .H 和 .C 文件中组织我的小功能

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

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

这些函数很小,因此它们是内联的非常好的候选者,但我不知道它们是否会确定。

我对我组织文件的方式有疑问,我认为将我的所有函数直接内联到没有 .C 文件的 .h 文件中可能会更好。你能帮我澄清一下我的疑问吗?

4

3 回答 3

3

首先,请注意,您可以通过添加选项告诉gcc尝试将小函数内联到调用者中。-finline-functions

如果你对你的函数实际上会被内联有任何疑问,你可以让gcc警告你关于不可内联的函数,方法是使用-Winline

在这里,由于您的函数同时声明externinline,它们被内联,因为该inline定义将仅用于内联。在这种特殊情况下,该函数根本不会自行编译。

阅读http://gcc.gnu.org/onlinedocs/gcc/Inline.html了解更多详情。

于 2012-03-30T16:33:38.160 回答
2

不管你的函数有多小,编译器的选择是是否内联它。

因此,即使您的函数数量很少,并且将它们全部内联在代码中,仍然不能保证编译器会内联所有函数。

你可以在这里找到一些关于内联的有用的 inshgts 。

于 2012-03-30T15:58:58.743 回答
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 );
于 2012-03-31T09:23:30.197 回答