我听说,当你只有一个(main.c)文件(或使用"unity build")时,如果你把所有的函数都设置为静态,会有很多好处。
我有点困惑,为什么这个(据称)在默认情况下没有优化,因为你不可能将main.c包含到另一个文件中,在那里你将使用它的一个函数。
在实现它之前,我想知道这样做的好处和危险。
的例子:
c
static int my_func(void){ /*stuff*/ }
int main(void) {
my_func();
return 0;
}
你在评论中有各种各样的智慧块,在这里汇集成一个社区维基的答案。
Jonathan Leffler注释:
静态函数的主要好处是,当编译器知道没有其他代码可以调用该函数时,它可以(并且将会)积极地内联它们。我偶尔会收到来自四个级别的内联函数调用(三个限定的"内联from"行)的错误消息。编译器能做的事真让人吃惊!
:
FWIW:我的经验法则是,每个函数都应该是
static
,直到它知道它将从另一个文件中的代码调用。当知道它将在其他地方使用时,应该在头文件中声明它,该头文件包含在函数定义和使用的地方。(类似的规则也适用于文件作用域变量——又名"全局变量";它们应该是static
,直到在其他地方被证明需要它们,然后它们也应该在头文件中声明。
main()
函数总是从启动代码调用,所以它永远不是静态的。与无条件编译的main()
函数在同一文件中定义的任何函数都不能被其他程序重用。(库代码可能包含一个有条件编译的测试程序,用于源文件中定义的库函数-我的大多数库代码在末尾有#ifdef TEST
/…test program…/#endif
)
Eirc deferischil的广义:
一般规则:任何时候你可以编写代码,说明使用某些东西是有限的,就这样做。值不会被修改吗?让它成为
const
。名称只需要在某个部分使用?在最内层的封闭作用域中声明它。名称不需要外部链接?设为static
。每个限制都缩小了漏洞产生的窗口,并可能消除干扰优化的复杂性。