汗颜呀,static还能这样用。

2020-01-27 11:50发布

  1. void Init_system(void) REENTRANT
  2. {
  3.          unsigned char i;
  4.         P1=255;
  5.        if(i==0)
  6.             {
  7.                  static unsigned char b=25;
  8.                  b++;      //前后多次调用Init_system()函数,此处b的值会作累积。
  9.                  P1=b;
  10.             }
  11.        else
  12.            {
  13.                  P1=0;
  14.            }
  15.       TMOD &= 0xF0;
  16.       TMOD |= 0x01;
  17.       TH0 = TIMER_20MS_TH0;
  18.       TL0 = TIMER_20MS_TL0;
  19.       ET0 = 0;
  20.       EA=0;
  21.      TR0 = 0;
  22. }
复制代码且看上面的代码。
我一直以为static只是用来限制文件中函数和变量的作用域、函数体内变量的作用域,同时对变量还起到不消亡的作用。
我还真的想不到还能用在复合语句内对变量定义使之“不消亡”
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
41条回答
XIVN1987
1楼-- · 2020-01-30 00:28
twitter 发表于 2013-5-9 12:30
对现在的C编译器来说,应该是按语句块来划分的,比如gcc下for循环就能这么写:

for (int i=0; i ...

"for (int i=0; i<10; i++) { ... }"

这种写法在MDK里面不支持,我试过。。。必须写成:
int i;
for(i=0;i<10;i++) {...}
jswd0810
2楼-- · 2020-01-30 03:10
这个不奇怪吧,
twitter
3楼-- · 2020-01-30 06:49
XIVN1987 发表于 2013-5-9 12:50
"for (int i=0; i

realview的编译器是支持的,只不过它默认是按C90标准编译的,你在C/C++那里的编译参数里加上 --c99 就能用了。

顺便说一下,realview也支持部分gcc的扩展语法,同样也要加参数 --gnu,这样可以使用像“case 11 ... 100:”这样的范围case写法,
还有指定初始化“int a[6] = { [4] = 29, [2] = 15 };”,
还有标签值功能,用来做跳转表:
int f(int n)
{
    void *const table[] = { &&a1, &&a2};
    goto *table[n];
a1: return 1;
a2: return 2;
}

void *toggle(void *lab, int *x)
{
    if (lab) goto *lab;
a1: *x = 1; return &&a2;
a2: *x = 0; return &&a1;
}


bbssilverkey
4楼-- · 2020-01-30 12:06
 精彩回答 2  元偷偷看……
zhanan
5楼-- · 2020-01-30 15:22
变量就是RAM的地址,从汇编层面看想怎么用就怎么用,但是到C层面上,为了不至于引起混乱,做了一些约定:

局部变量(内部变量):在函数内部定义,内部使用,或者在程序块{}中。动态存在的,即用完后即释放,同一块地址空间可能会被不同的局部变量使用,默认是动态的,或者用auto指定。
静态存在的,用static指定,固定地址,长期存在,保留上次引用后的值。
全局变量(外部变量):在函数外部定义。全局变量前面加static,表示该变量的作用范围限定在该文件内,不允许被其他文件引用。
XIVN1987
6楼-- · 2020-01-30 19:58
twitter 发表于 2013-5-9 17:27
realview的编译器是支持的,只不过它默认是按C90标准编译的,你在C/C++那里的编译参数里加上 --c99 就能 ...


这么强大,连GCC扩展都支持!!!多谢指教。。

一周热门 更多>