就我目前对'static'关键字的理解而言,它会阻止变量被重新初始化,并且它会阻止变量在函数结束时离开内存。
在C中,我通常在变量不需要是全局变量时使用它,但也不应该在函数调用之间进行更改。 (f.i.微控制器中断)
现在,在STM32的一些C代码中,我看到了以下内容:
int main(void)
{
static char buffer[CONSOLEBUFFERSIZE];
...
对我来说,这没有意义。此变量用于缓冲传入的命令,以便在收到终止字符时处理它们。但是我之前描述的'static'的两个属性并不适用于main函数,因为main()只调用一次而'never'结束。所以我的实际问题是:
这可能是使用了一些我不知道的hocus-pocus,还是仅仅是从中断或其他函数中复制代码,程序员是否忘记了或者不想删除静态关键字?
答案 0 :(得分:12)
一个区别是,静态变量通常使用程序的数据段而不是堆栈。也许这就是将buffer
声明为static
的原因(特别是如果CONSOLEBUFFERSIZE
很大)。
答案 1 :(得分:3)
在某些系统上,堆栈是固定的,有限的大小。在这些情况下,static
仅用于将缓冲区移出堆栈并将其放置在已设置链接器的位置以分配更多空间。
也可以重新配置链接器以提供更大的初始堆栈,但static
更容易,仍然是正确的。
答案 2 :(得分:0)
我认为当你制作一个包含许多文件和主管的c项目时,它的价值不会改变....