回头来看C语言里的static

没见过什么大世面,程序也都是上千行最多了,所以,这些也都没仔细考虑过。前面为了面试草草的看了下static的一些关键用法,囫囵吞枣,压根没搞明白具体用处,居然都能蒙混过关。

学习lua到lua包的部分。看到下面一种定义包私有的方法,有点茅塞顿开的意思:

local function checkComplex(c) 
  if not ((type(c) == "table") and tonumber(c.r) and tonumber(c.i)) then 
  error("bad complex number", 3) 
  end 
end 
 
local function new(r, i) 
 return {r = r, i = i} 
end 
local function add(c1, c2) 
 checkComplex(c1); 
 checkComplex(c2); 
  return new(c1.r + c2.r, c1.i + c2.i) 
end 
 
... 
 
complex = { 
 new = new, 
 add = add, 
 sub = sub, 
 mul = mul, 
 div = div, 
}

上面的例子是把所有的函数(包成员)都定义为私有变量,然后再申请公有变量,把私有变量赋值给公有变量。如此,没有经过重新赋值过的变量,在本文件之外是无法访问到的。这里的local关键词,就和c语言里的static关键词是一样的。(需要后面看看用c实现的lua解释器怎么做的,也算是又分析了一个经典代码库)。

同样,不希望被从其它文件访问的变量,我们可以用static把它锁起来。

既然到这里了,再顺便整理一下C里面static关键词的用法(巨汗,从百度文库搜到一篇文章,居然有7页!!!):

1、对于变量:

不管是局部变量,还是全局变量,用static声明之后,都是存储在静态区。未初始化的静态变量自动赋初值为0。

关于静态存储区:静态存储区也就是通常说的数据段,还会有初始化数据段和未初始化数据段之分;堆是留给程序动态申请空间的,也就是malloc出来的;而栈则是留给局部变量的。

全局变量经static声明后,只能有本文件范围内可调用;而局部变量作用域还是定义空间内,但是它的值会因为修改而被更新,而不是再次由栈分配并初始化。

全局变量的好理解,下面看看用static声明的局部变量

#include        <stdio.h>
#include        <stdlib.h>

int
test()
{
        static int a = 1;
        a = a + 1;
        return a;
}

int
main()
{
        int b;
        b = test();
        printf("%d\n",b);
        b = test();
        printf("%d\n",b);
}

它的结果是:2、3

2、对于函数

c里面的全局变量及函数是默认可以extern的,而用stiac声明过之后,就只有在本文件内可用了。

用static 定义函数或全局变量名之后,有以下两个好处:

a、在本文件内可见,可防止污染变量名,防止与其它文件内变量名冲突。

b、只有本文件可调用该函数或该变量,本文件之外无法访问。

在其他地方看到有另外的好处,这个是比较稀罕的东西:用static声明后,它会从一开始就拥有内存空间,函数和变量都是如此(预先给函数分配空间?这个怎么理解,没学过编译原理啊);这个内存空间的生存周期到程序结束,也就是他不是栈给他临时分配空间。这样做大大节约了切换时间(我怎么觉得不会有多少:x)。

——————
无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
原文地址:https://www.cnblogs.com/pied/p/2244578.html