在C程序开发过程中,很多人都忽视了静态变量和静态函数重大作用。笔者就遇到一位资深程序员,看到我写的代码里有static标识,很好奇,我告诉他后,他立马用到他程序里面了~~。
forum.jpg
静态类型
根据static修饰的对象,可分为两大类:在函数前面的和在变量前面的。
1. 放在函数前面
在实际项目中,我们经常会定义这样一些小函数,它们只被定义他们的那个文件里的其它函数调用,而不会被其它文件里的函数调用,即局部函数。建议要这样的函数前要加static,表明此函数的作用范围是本文件,也只能在本文件中使用,当然头文件中也是不能出现这个函数申明的,否则会报错。
来看一个例子,同一个项目包含file1.c和file2.c
//file1.c中
  • int add(int x, int y)
  • {
  • return (x+y);
  • }
  • void int funFile1(void)
  • {
  • return add(1, 2);
  • }
  • 复制代码
    //file2.c中
    float add(float x, float y)
  • {
  • return (x+y);
  • }
  • void float funFile2(void)
  • {
  • return add(1.1, 2.1);
  • }
  • 复制代码
    很明显,编辑时会报add函数重复定义的错误。现在我们在add前面加上static试试。
    //file1.c中
    static int add(int x, int y)
  • {
  • return (x+y);
  • }
  • //调用本文件中static函数
  • void int funFile1(void)
  • {
  • return add(1,2);
  • }
  • 复制代码
    //file2.c中
    static float add(float x, float y)
  • {
  • return (x+y);
  • }
  • //调用本文件中static函数
  • void float funFile2(void)
  • {
  • return add(1, 2);
  • }
  • 复制代码
    编辑通过,完全正确。说明在同一个项目中,不同文件中含有相同名字的static函数是允许的。这个功能在多人合作的大项目中,特别有用,只要大家定义好接口函数,可以极大的避免同文件名的错误。
    2.放在变量前面
    分在函数内和在函数外两种情况,关于Static变量在内存中的位置,详见关于内存堆栈 https://www.toutiao.com/w/1641211633920014/
    2.1 函数内的static变量
    函数内的static变量只能被本函数调用,其特点是只能被初始化一次,而且,退出函数后其值会保持,限于函数内的“全局”变量.
    //每调用一次,val值增1
    void int getCount(void)
    {
    //编辑时完成初始化值为1
    static int val=1;
    val++;
    return val;
    }
    2.2 函数外的static变量
    定义在函数外的static变量只能被本文件中的函数使用,不能被其它文件使用。来看例子,同一个项目包含file1.c和file2.c
    //file1.c
    //编辑时完成初始化值为1
  • //与file2中的val没关系
  • static int val=1;
  • void int incCount(void)
  • {
  • val++;
  • return val;
  • }
  • //静态函数 (限file1.c)
  • static void int decCount(void)
  • {
  • val--;
  • return val;
  • }
  • 复制代码
    //file2.c
    //编辑时完成初始化值为10
  • //与file1中的val没关系
  • static int val=10;
  • void int inc(void)
  • {
  • val++;
  • return val;
  • }
  • //静态函数 (限file2.c)
  • static void int decCount(void)
  • {
  • val--;
  • return val;
  • }
  • 复制代码
    编译通过,完全正确。同一项目中的不同文件含有同名静态变量允许存在,其作用域与静态函数一致。

    forum.jpg

    forum.jpg