这里借鉴一篇文章:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html#undefined

在这里举个例子,先和你说说局部变量和全局变量。

#include <stdio.h>
#include <STC89C5xRC.H>
void function2();
void function1();
void function3();
unsigned int iii = 0; //初始化全局变量
void main()
{
TI = 1; while(1)
{
function1();
function2();
function3();
}
} /*局部变量记得初始化*/ void function1()
{
unsigned int i = 0; //初始化
++i;
printf("i = %d\n",i);
}
void function2()
{
static unsigned int ii = 0; //初始化
++ii;
printf(" ii = %d\n",ii);
}
void function3()
{
++iii;
printf(" iii = %d\n",iii);
}

 输出结果为:

主函数前声明了function1(),function2(),function3(),以及声明并且初始化了一个全局变量 iii 。

我们还是先看functon1(),function2()。这两个函数里面都声明并且初始化了局部变量,但是我从输出的数据可以看到,变量 i 的数据在每一次进入function1函数时都进行初始化,并且进行自增 1 , 所以每一次的 i 输出的值每次都是 1.

而function2()函数在声明变量 ii 时,在开头加了static,所以会保存上一次的运算结果,不会再进行初始化。但是作用域也仅仅是在function2(),函数里面。

那么可能会有人问,如果不进行初始化会怎么样???

当然当然是乱套了啦,没有进行初始化,局部变量里面的数值将是随机的,不为人知的数据,所以声明变量的时候还是要对数据进行初始化的。不然的话,程序能不能正确运行都是一个问题。而在这个keil这个开发环境里面,不会警告,不会报错,但是程序不能正确运行。

然后再看全局变量 iii ,输出结果和变量 ii ,相同,但是和变量 ii , 有本质性不同的是,全局变量 iii 可以任意函数使用。而局部变量 ii 只能是function2使用。这些表象不同也是基于数据存储的位置不同而影响到数据的生存。局部变量的数据存储在堆栈段,全局变量存储在数据段。

接下来就说在多个C文件中static的使用:

首先还是要在工程里面添加三个C文件,如下图所示:

main.c

 #include <stdio.h>
#include <STC89C5xRC.H> void function3();
extern void function4();
extern void function5();
unsigned int iii = ; //初始化全局变量
void main()
{
TI = ; while()
{ function3();
function4();
function5();
}
}
void function3()
{
++iii;
printf("iii = %d\n",iii);
}

main_2.c

 #include <stdio.h>
static unsigned int iii =;
void function4()
{
iii++;
printf("static iii = %d\n",iii);
}

main_3.c

 #include <stdio.h>
static unsigned int iii =;
void function5()
{
iii++;
printf("static iii = %d\n",iii);
}

可以看到三个C文件中,都定义相同的变量 iii ,而且都是各自C文件的全局变量。但是却不冲突。输出的结果如下图所示:

所有的iii,虽然同名,但是,他们不是相同的地址。

多文件中的static的更多相关文章

  1. [C/C++]在头文件中使用static定义变量意味着什么

    文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...

  2. java转换unicode,筛选文件中的insert语句并把日期给转换为可以直接在数据库执行的语句

    package com; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; impo ...

  3. IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中

    需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数 ...

  4. 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中

    package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...

  5. java:从指定问价中读取80个字节写入指定文件中

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class F ...

  6. c++多个文件中如何共用一个全局变量

    例子: 头文件:state.h   源文件:state.cpp 其它源文件:t1.cpp  t2.cpp  t3.cpp, 这些源文件都包含头文件state.h. 需要定义一个全局变量供这些源文件中使 ...

  7. 读取xlsx文件的内容输入到xls文件中

    package com.cn.peitest.excel; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...

  8. C# static方法-使用迭代器循环遍历文件中的额行

    //封装的方法 //读取文件的值,放入集合中 public static IEnumerable<string> ReadLines(string fileName) { using (T ...

  9. Django 中的static文件的设置

    STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ('article',os.path.jo ...

随机推荐

  1. 搜索模式| 系列2——KMP算法

    给定一个文本txt [0..n-1]和一个模式pat [0..m-1],写一个搜索函数search(char pat [],char txt []),在txt中打印所有出现的pat [] [].可以假 ...

  2. Swift学习第一天--面向过程

    //: Playground - noun: a place where people can play import UIKit //---------------------- Hello wor ...

  3. php-redis 操作类 封装

    <?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...

  4. Docker(六):Docker网络配置进阶

    1.Docker集群网络配置之Weave Weave是Github上一个比较热门的Docker容器网络方案,具有非常良好的易用性且功能强大.仓库地址:https://github.com/weavew ...

  5. jQuery模块化开发

    //定义了命名空间. var Itcast = {}; //定义第二级别的 命名空间. var Itcast.Model = {}; var Itcast.Model.UIJs = (function ...

  6. windows下查看端口占用情况及关闭相应的进程

    经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人都比较头疼,下面就介绍一种非常简单的方法. 例如:需要查看9001端口被谁占用,并将其进程强制关闭 在 ...

  7. VOOC还真算是OPPO的核心技术

    经常电视看到OPPO打广告说它的VOOC,觉得好奇怪,就一个手机充电讲个不完,尽是骗3.4线城市的人,不过今天研究了一下,还VOOC真算是它的核心技术了. 现在选手机,电池和充电速度是非常重要的,首先 ...

  8. SQL奇技淫巧

    1.SQL行列转换 问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94想变成(得到如下结果): 姓名 ...

  9. Git详解之三:Git分支

    Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...

  10. vmware workstation14永久激活密钥分享

    vmware workstation14永久激活密钥分享 VMware Workstation是一款功能强大的桌面虚拟计算机软件,简单来说就是最强的中文虚拟机了,可以在桌面上运行不同的操作系统,下面就 ...