1

我正在用 C 编程。我想要一些关于静态和内联函数的描述。我知道,如果我们将一个函数设为静态,那么它向编译器表明它只有一个翻译单元处于内部链接之下。我对 static 和 inline 有以下疑问:

  1. 如果我们将一个函数设为 static ,我们可以在其他翻译单元中使用它......即在其他 .c 文件中吗?如果是..怎么样?
  2. 如果我们将函数设为静态内联,那有什么区别呢?编译器将如何处理它?
  3. 将函数设为静态会产生与宏相同的效果吗?
  4. 将函数处理为内联取决于编译器,具体取决于大小。那么有什么方法可以强行让它像内联一样对待呢?
  5. 我们如何使用内联和静态函数进行优化?

请对上述内联内容有所了解。平台是Linux,gcc编译器,C语言。

4

3 回答 3

4
  1. 一个static函数不能在其他翻译单元中使用。这就是他们存在的理由。

  2. inline提示编译器该函数应该被内联而不是被调用。

  3. 将函数设为静态与使用宏不同。宏本质上会否决编译器。无论它是否认为内联是否明智,宏都会被内联;宏是文本替换。您还可以将static函数传递给需要函数指针的对象。不能用宏来做到这一点。

  4. 宏将强制内联任何内容。即使指定inline也可以被否决。

  5. 制作不想导出的函数static。如果一个函数真的很小,并且你真的认为它应该被内联,你可以告诉编译器用inline. 宏实际上仅用于元编程。编译器比你更清楚。

于 2012-04-30T04:26:23.113 回答
3

staticinline服务于两个截然不同的目的。

正如您所说的正确static意味着函数的符号不是从定义它的编译单元中导出的。因此不同的编译单元可以有这样的同名符号而不会发生冲突。这是否对应于相同的函数声明和定义取决于您。但是,通过静态或动态导出指向它的指针,可以很好地在不同的编译单元中使用所有静态分配的对象等函数。

inline是不同的。它的目的是使编译器可以内联你的函数,因此它的名字,但它的主要直接影响是函数符号通常根本不发出。这样做的目的是您可以将函数的定义放在头文件中,并将该文件包含在几个编译单元中,而无需在每个编译单元中创建多个符号。对于定义的函数,它还具有不允许在函数static内声明变量的效果inline,因为根本不清楚该对象必须在哪个编译单元中实现。

总而言之,static生成大量函数副本,inline没有生成;static主要用于".c"文件inline".h"

第一个具有您可能在某些地方没有检测到两个函数指针指向“相同”函数的效果,第二个可能具有如果您需要一个指向该函数的函数指针的效果,则没有它可以指向的函数对象参考。通过在 .c 文件中放置一种“实例化”,可以强制发出这样的函数(仅在一个编译单元中!):

// .h definition
inline void toto(void) { }

// .c instantiation
void toto(void);
于 2012-04-30T08:44:23.237 回答
1

如今,编译器将确定内联函数是否实际上是内联的,因为并非所有函数都适合它。如果是这样,则在引用相应函数的地方简单地注入/内联函数体。

这些函数应该保留给函数体通常很短的频繁函数调用,尽管我认为不一定是这种情况。

于 2012-04-30T04:24:09.063 回答