单片机沉思录——static

在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

(1)先来介绍它的第一条也是最重要的一条:隐藏。

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。

 char a = 'A';
 
void msg() 
{
    printf("Hello\n"); 
}

下面是main.c的内容

int main(void)
{    
    extern char a;    // extern variable must be declared before use
    printf("%c ", a);
    (void)msg();
    return 0;
}

 

程序的运行结果是:

A Hello

你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。

#include <stdio.h>

int fun(void){
    static int count = 10;    // 事实上此赋值语句从来没有执行过
    return count--;
}

int count = 1;

int main(void)
{    
    printf("global\t\tlocal static\n");
    for(; count <= 10; ++count)
        printf("%d\t\t%d\n", count, fun());    
    
    return 0;
}

 

程序的运行结果是:

global          local static

1               10

2               9

3               8

4               7

5               6

6               5

7               4

8               3

9               2

10              1

 

(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。不妨做个小实验验证一下。

#include <stdio.h>

int a;

int main(void)
{
    int i;
    static char str[10];

    printf("integer: %d;  string: (begin)%s(end)", a, str);

    return 0;
}

程序的运行结果如下

integer: 0; string: (begin)(end)

最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

例如:

/*-----------------------------------------------

  名称:99秒倒计时器

  日期:2009.5

  修改:无

  内容:通过定时器倒计时

------------------------------------------------*/

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

          //共阴数码管 0-9 

unsigned char Dis_qainwei;

unsigned char Dis_baiwei;

unsigned char Dis_Shiwei;//定义十位

unsigned char Dis_Gewei; //定义个位

/******************************************************************/

/*                    延时函数                                    */

/******************************************************************/

void delay(unsigned int cnt)

{

 while(--cnt);

}

/******************************************************************/

/*                    主函数                                      */

/******************************************************************/

main()

{

TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式1,16位定时

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

IE= 0x82;  //打开中断

TR0=1;     //打开定时开关

while(1)

  {

  P0=Dis_qainwei; 

  P2=0;

  delay(300);    

  P0=Dis_baiwei; 

  P2=1;

  delay(300);    

  P0=Dis_Shiwei; 

  P2=2;    

  delay(300);    

  P0=Dis_Gewei;  

  P2=3;

  delay(300);

 

 

  }

}

/******************************************************************/

/*                    定时器中断函数                              */

/******************************************************************/

void tim(void) interrupt 1 using 1

{

 static unsigned long second=9999,count; //初值99  static相当重要,否则不能减数

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

 count++;

if (count==10)

    {

    count=0;

    second--;//秒减1

if(second==0)

  

   second=9999;  

   

Dis_qainwei=tab[second/1000] ;

Dis_baiwei=tab[second%1000/100] ;

Dis_Shiwei=tab[second%1000%100/10];//十位显示值处理

     Dis_Gewei=tab[second%10]; //个位显示处理

    

    }

}

时间: 2024-08-21 20:57:52

单片机沉思录——static的相关文章

单片机沉思录——再谈static

静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值.     静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明的static变量,可作为对象间的一种通信机制     如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量.这个对象将只在执行线程第一次到达它的定义使初始化.用法2:局部静态对象     对于局部静态对象,构造函数是在控制线程第一

c++-C++沉思录第九章编译问题

问题描述 C++沉思录第九章编译问题 main1.cpp:20: 错误:no match 为'operator<<'在'std::cout << p'中 解决方案 C++沉思录第九章的练习 解决方案二: iostream头文件包含正确了吗 解决方案三: #include #include "picture.h" main 文件 解决方案四: #include #include "picture.h" main 文件 解决方案五: #inclu

【好书试读】交互设计沉思录——顶尖设计专家Jon Kolko的经验与心得

开始试读:https://yqfile.alicdn.com/b12816b6bb15db27d068501ec382db3f.pdf 天猫购买链接:交互设计沉思录--顶尖设计专家Jon Kolko的经验与心得 本书由交互设计领域的思想领袖Jon Kolko所著,是交互设计领域的里程碑之作.本书完美地将当代设计理论和研究成果融入交互设计实践中,将对交互设计的阐释和分析推向了新的高度. 本书重点阐释了对交互设计领域的最新理解和洞察,以及人与科技之间的联系.作者通过引人入胜的内容实现对设计师的教化,

《设计模式沉思录》—第1章1.1节对模式的十大误解

第1章 介绍设计模式沉思录在阅读本书之前,如果读者还没有听说过一本名叫<设计模式>(Design Patterns: Elements of Reusable Object-Oriented Software [GoF95])的书,那么现在正好可以去找一本来读.如果读者听说过该书,甚或自己还有一本但却从来没有实际研读过,那么现在也正好应该好好研读一下. 如果你仍然在继续往下阅读,那么我会假设你不是上述两种人.这意味着你对模式有大致的了解,特别是对23个设计模式有一定的了解.你至少需要具备这样的

《设计模式沉思录》—第2章2.1节基础

第2章 运用模式进行设计设计模式沉思录如果想体验一下运用模式的感觉,那么最好的方法就是运用它们.对我来说,最大的挑战在于找到一个所有人都能够理解的示例.人们对自己的问题最感兴趣,如果某些人对某个示例越感兴趣,这个示例往往就越具体.问题在于,这样的示例所涉及的问题往往太过晦涩,对于没有相关领域背景的人来说难以理解. 层级文件系统(hierarchical file system)是每个计算机用户都熟悉的东西,就让我们来看看该如何设计它.我们不会关心诸如I/O缓冲和磁盘扇区管理之类的底层实现问题,我

《设计模式沉思录》目录—导读

版权声明设计模式沉思录Authorized translation from the English language edition, entitled Pattern Hatching: Design Patterns Applied, 9780201432930 by John Vlissides, published by Pearson Education, Inc., publishing as Addison-Wesley Professional. Copyright 1998

迪克森沉思录之做Global SAP项目的弊端

迪克森沉思录之做Global SAP项目的弊端 笔者在过去的十年里,参与过好几个大型跨国企业在国内工厂的SAP推广实施项目,这种项目就是将总部设计好的全球模板推广到其海外工厂,使得其诸多海外工厂能按照同一个模式在其GLOBAL唯一的服务器上运行其日常业务,实现全球总部对于海外工厂的统一掌控与管理.   参与这种项目的好处,笔者在之前的诸多文章里已经分析过,这里不再赘述.笔者在这里就参与这种项目的诸多弊端,结合个人的项目实践与思考,予以阐述和分析.   弊端之一:顾问的咨询价值的发挥受到掣肘,不能

《设计模式沉思录》—第2章2.7节多用户文件系统的保护

2.7 多用户文件系统的保护我们已经讨论了如何给我们正在设计的文件系统添加简单的单用户保护.前面提到我们会将这个概念扩展到多用户环境,在这个环境中许多用户共享同一个文件系统.无论是配以中枢文件系统的传统分时系统,还是当代的网络文件系统,对多用户的支持都是必不可少的.即使那些为单用户环境所设计的个人计算机操作系统(如OS/2和Windows NT),现在也已经支持多用户.无论是什么情况,多用户支持都给文件系统保护这一问题增加了难度. 我们将再一次采用最简易的设计思路,效仿Unix系统的多用户保护机

国产大片沉思录繁华背后的六大危机

[前言] 10年前,中国电影市场"生,或者死"不断被人们重复疑问,对于中国电影来说并不是一个哲学问题,而是一个现实困境. 随着国产大片时代的到来(请参考<新调查:国产大片十年变迁录>),市场问题得到大大的缓解,但一批新的问题又随之产生,看似繁华的国产大片背后危机四伏:热钱与资本疯狂涌入导致双胞胎多胞胎产生:明星遭遇疯抢片酬飞涨:产业机制不成熟:好莱坞大制作接踵而至:类型化完善--面对诸多问题,国产大片能否遏制与解决?愿我们的思考与探讨能抛砖引玉,给予华语电影更多建议: 危机