在C.荫编程我想了解的静态和内联函数的一些描述。 我知道,如果我们做一个功能的静态那么它是编译器,它是根据内部链接只有一个翻译单元的指示。 我有一个关于静态和内联下面的疑惑:
- 如果我们做一个函数作为静态的,我们可以用它在其他翻译单元...即在其他.c文件? 如果是..how?
- 如果我们做的函数为静态内嵌有什么区别呢? 怎么会被编译器处理?
- 是不是只要一个函数作为静态给宏同样的效果?
- 处理的功能的内联是依赖于根据其大小的编译器。 那么,有没有办法,我们可以有力地使其像内联可以治疗吗?
- 我们如何使用内联和静态函数进行优化?
请洒在上面的东西内嵌的一些情况。 平台是Linux,gcc编译器,C语言。
static
和inline
服务两个非常不同的目的。
至于你说的正确static
表示函数的符号不是从定义它的编译单元出口。 因此,不同的编译单元可以有不冲突的同名这样的符号。 这是否对应于相同的函数声明和定义是你。 但这样的功能,因为所有的静态分配的对象可以很好地在不同的编译单元通过静态或动态出口指向它的指针使用 。
inline
是不同的。 它的目的是使人们有可能对编译器内联的功能,因而得名,但其主要的直接效果是函数符号通常不发出的。 这是专为你可以把函数的定义在头文件,包括该文件在多个编译单元无需在每个人创建多个符号的目的。 对于定义的功能它也有,你是不允许声明的效果static
内部变量inline
函数,因为它不会是清楚该对象必须实现其编译单元都没有。
因此,要总结, static
产生大量的功能的副本, inline
产生无; static
在它的主要用途".c"
文件,并inline
在".h"
首先有一个可能会在某些地方无法检测到两个函数指针指向“相同”的功能,第二个可能是,如果你需要一个函数指针函数没有函数对象的影响的效果,它会参考。 这样的功能可以通过将一种在.c文件“实例”中被强制发射(只在一个编译单元!):
// .h definition
inline void toto(void) { }
// .c instantiation
void toto(void);
这几天编译器将决定是否inline函数实际上将内联与否,因为不是所有的功能都不错的候选人了。 如果是,则功能体被简单地注入/内联,其中相应的功能被引用。
这些功能应预留频繁的函数调用其中的函数体通常很短,但我想这不必须是这种情况。