没见过什么大世面,程序也都是上千行最多了,所以,这些也都没仔细考虑过。前面为了面试草草的看了下static的一些关键用法,囫囵吞枣,压根没搞明白具体用处,居然都能蒙混过关。
学习lua到lua包的部分。看到下面一种定义包私有的方法,有点茅塞顿开的意思:
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。
全局变量经static声明后,只能有本文件范围内可调用;而局部变量作用域还是定义空间内,但是它的值会因为修改而被更新,而不是再次由栈分配并初始化。
全局变量的好理解,下面看看用static声明的局部变量
#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)。