回头来看C语言里的static
没见过什么大世面,程序也都是上千行最多了,所以,这些也都没仔细考虑过。前面为了面试草草的看了下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)。
无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!