静态和内联

我在C编程。我想要一些关于静态和内联函数的描述。 我知道,如果我们把一个函数做成静态的,那么它就是编译器的一个指示,即它只在一个翻译单元的内部链接下。 我有以下关于静态和内联的疑问:

  1. 如果我们做一个静态的函数,我们可以在其他的翻译单元中使用它…即在其他.c文件中? 如果是的话,如何?
  2. 如果我们将函数作为静态内联,那么有什么区别? 编译器如何处理它?
  3. 是否将函数作为静态函数产生与macros相同的效果?
  4. 将函数视为内联取决于编译器的大小。 那么有什么办法可以强制让它像内联一样被对待?
  5. 我们如何使用内联和静态函数进行优化

请在上面的内容中阐明一些内容。 平台是Linux,gcc编译器,C语言。

Solutions Collecting From Web of "静态和内联"

  1. 其他翻译单位不能使用static功能。 这是他们存在的理由。

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

  3. 使一个函数静态是不同于使用宏。 宏本质上否定了编译器。 不管内联是否明智,宏都会内联; 宏是文本替换。 你也可以将一个static函数传递给需要函数指针的东西。 不能用宏来做到这一点。

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

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

staticinline服务两个非常不同的目的。

正如你所说的正确的static意味着函数的符号不是从定义它的编译单元中导出的。 因此不同的编译单元可以具有相同名称的符号而不冲突。 是否对应于相同的函数声明和定义取决于您。 但是,所有静态分配的对象都可以通过静态或动态地将指针导出到不同的编译单元。

inline是不同的。 它的目的是使编译器能够内联你的函数,也就是名字,但是它的主要直接效果是函数符号通常不被释放。 这是为了使您可以将函数的定义放在头文件中,并将其包含在多个编译单元中,而不在每个编译单元中创建多个符号。 对于已定义的函数,它也具有不允许在内inline函数内声明static变量的效果,因为根本不清楚在哪个编译单元中必须实现该对象。

所以总结一下, static生成大量的函数副本, inline生成; static主要用在".c"文件中, inline".h"

第一个效果是你可能在某些地方没有检测到两个函数指针指向了“相同”函数,第二个可能会产生这样的效果:如果你需要一个指向该函数的函数指针,那么它没有函数对象参考。 通过在.c文件中放置一个“实例化”,可以强制这样的函数被发送(只用一个编译单元!):

 // .h definition inline void toto(void) { } // .c instantiation void toto(void); 

现在,编译器将决定一个内联函数是否真的被内联,因为并不是所有的函数都适合它。 如果是这样的话,那么函数体被简单地注入/内联,在那里引用相应的函数。

这样的功能应该保留给频繁的函数调用,而函数体通常很短,尽管我想这不是必须的。