在为即将到来的C语言考试做准备时,突然发现C似乎也没有想象中的那么简单,闭卷考的话还是又喝多细枝末节的东西值得注意的……

对刚刚接触C的大一新生来说,我们对在练习题中很少出现的typeof、enum、static比较陌生,我在多方查找资料下算是总结出了一点点门路。

static关键字的利用

利用static定义局部变量

阅读下面一段代码,你能看出结果嘛?

void fn(void)
{
    int n = 10;

    printf("n=%d\n", n);
    n++;
    printf("n++=%d\n", n);
}

void fn_static(void)
{
    static int n = 10;

    printf("static n=%d\n", n);
    n++;
    printf("n++=%d\n", n);
}
void fn_static1(void)
{
    static int n = 10;

    printf("static n=%d\n", n);
    n++;
    printf("n++=%d\n", n);
}
int main(void)
{
    fn();
    printf("--------------------\n");
    fn_static();
    printf("--------------------\n");
    fn();
    printf("--------------------\n");
    fn_static();
    printf("--------------------\n");
    fn_static1();

    return 0;
}

你应该很容易想到结果是:

n=10
n++=11
--------------------
static n=10
n++=11
--------------------
n=10
n++=11
--------------------
static n=11
n++=12
--------------------
static n=10
n++=11

那么如何区分全局变量与static的效果呢?全局变量对所有源文件的所有函数都管用,static变量只对static定义所在作用域管用,且可以复用,即重复调用函数static变量保持上一次调用结束的值,但对不同函数如此例子中的fn_static1()就没有这种效果了。

正如注释所说,合理的利用static既能规避全局变量不能重名等一些缺点,也能实现部分全局变量的效果,可谓一举两得!

需要注意的是由于static局部变量的这种特性,使得含静态局部变量的函数变得不可重入,即每次调用可能会产生不同的结果。这在多线程编程时可能会成为一种隐患。需要多加注意。

利用static定义局部变量

在函数外声明的static变量为static全局变量,其“地位”居于普通全局变量与static局部变量之间——只能被本文件下声明的函数调用,这在开发大型工程时含有多个源文件的情况下十分常见。

如:file1.h如下:

void printStr();

我们在file1.c中定义一个静态全局变量hello, 供file1.c中的函数printStr访问.

#include "file1.h"

static char* hello = "hello cobing!";

void printStr()
{
printf("%s\n", hello);
}

file2.c是我们的主程序所在文件,file2.c中如果引用hello会编译出错

#include "file1.h"

int main()
{
printStr();
printf("%s\n", hello);
return 0;
}
Last modification:January 5th, 2019 at 12:57 pm
If you think my article is useful to you, please feel free to appreciate