• 回头来看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)。

    ——————
    无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
  • 相关阅读:
    安装Redis
    IntelliJ IDEA 2016.1 创建Maven Java Web项目(图解)
    MongoDB入门
    Oracler的锁概念
    Oracle 数据类型
    《锋利的jQuery》随笔(一)
    IList<T>之 First【学习笔记之Linq】
    入驻新园子
    使用nodejs下载风景壁纸
    nodejs爬取博客园的博文
  • 原文地址:https://www.cnblogs.com/pied/p/2244578.html
Copyright © 2020-2023  润新知