• 【C语言天天练(二)】statickeyword


    引言:

           

            statickeyword不仅能够修饰变量。并且能够修饰函数。了解它的使用方法,不仅对阅读别人的代码有帮助,也有助于自己写出更加健壮的程序。


    使用方法:

            

           用于不同的上下文环境时,statickeyword具有不同的意义。

          (一)

            当它用于函数定义时,或用于代码块之外的变量声明时,statickeyword用于改动标示符的链接属性,从externl改为internal。但标示符的存储类型和作用域不受影响。这样的方式声明的函数或变量仅仅能用于声明它们的源文件里

          (二)

            当它用于代码块内部的变量声明时,statickeyword用于改动变量的存储类型,从自己主动变量改动为静态变量。但变量的链接属性和作用域不受影响。用这样的方式声明的变量在程序运行之前创建,并在程序的整个运行期间一直存在,而不是每次在代码块開始运行时创建,在代码块运行完成后销毁。


    演示样例解析:


    代码解释一:

    main.c源代码

    #include <stdio.h>
    #include "test.h"
    
    void main(void)
    {
    	fun();			/*fun函数就是在test.c文件里声明的函数*/
    	printf("j = %d
    ", j);/*j变量也是在test.c文件里声明的变量*/
    }
    test.c源代码

    #include <stdio.h>
    
    static int i = 1;/*声明为内部变量,仅仅能用于test.c源文件*/
    int j = 2;/*能够作为外部变量使用,在main文件里用到了*/
    
    static void fun1(void)/*声明为内部函数,仅仅能用在test.c源文件里*/
    {
    	printf("i+1 = %d, j+1 = %d
    ", i+1, j+1);
    }
    
    void fun(void)/*能够用在其它文件里,用在main文件里*/
    {
    	printf("i = %d, j = %d
    ", i, j);
    	fun1();
    }
    
    test.h源代码

    extern int j;
    extern void fun(void);
    编译上面的程序:gcc main.c test.c -o test生成可运行文件test

    执行可执行文件test显示结果例如以下:

    i = 1, j = 2//该行是由main函数里调用的test.c文件里的fun函数生成的
    i+1 = 2, j+1 = 3//该行是由test文件里fun函数调用的fun1函数生成的
    j = 2//这是由main函数使用外部变量j直接生成的
    


    代码解释二:

    test.c源代码

    #include <stdio.h>
    
    void main(void)
    {
    	int i = 1;
    	printf("i = %d
    ", i);
    }
    teststatic.c源代码

    #include <stdio.h>
    
    void main(void)
    {
    	static int i = 1;/*用于代码块内部变量的声明*/
    	printf("i = %d
    ", i);
    }
    编译上面的两个文件

    gcc test.c -o test 

    gcc teststatic.c -o teststatic

    生成两个可运行文件test和teststatic

    使用size命令查看两个可运行文件各个段大小:size test teststatic

    text data bss dec   hex filename

    929  264     8   1201 4b1 test

    929   268    8   1205 4b6 teststatic

    使用static修饰的程序data段更大。由于它在程序运行之前创建,并一直存在到程序运行结束。


    补充:


    关于作用域存储类型的解释,參考:

    http://blog.csdn.net/to_be_it_1/article/details/24450227

    http://blog.csdn.net/to_be_it_1/article/details/24467879






  • 相关阅读:
    set bootarges
    UI 中的 结构体 字符串的 初始化
    putchar 代替printf
    石家庄 工作
    What's the value of i++ + i++?
    printf 打印 指定长度 字符串
    UI 点滴 积累
    static 关键字
    sdk
    隐式类型转换
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6821810.html
Copyright © 2020-2023  润新知