zoukankan      html  css  js  c++  java
  • 回头来看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)。

    ——————
    无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
  • 相关阅读:
    15个华丽的扁平风格的登录界面设计示例
    12款很酷的使用大头照的国外名片设计作品
    高清壁纸下载:15款精美的2014年元旦桌面壁纸
    Harp – 内置常用预处理器的静态 Web 服务器
    分享245款高质量的图标素材【免费下载】
    经典网页设计:关注用户体验的20个华丽网站
    使用 CSS3 实现超炫的 Loading(加载)动画效果
    你知道网页设计中最常用的15张图片素材吗?
    Koa – 更加强大的下一代 Node.js Web 框架
    Myth – 支持变量和数学函数的 CSS 预处理器
  • 原文地址:https://www.cnblogs.com/pied/p/2244578.html
Copyright © 2011-2022 走看看