• 关键字static、const、volatile的作用


    关键字static的作用是什么?
    这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
    1、在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
    2、 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
    3、在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
    大多数应试者能正确回答第一部分,一部分能正确回答第二部分,但是很少的人能懂得第三部分。做为一个合格的软件工程师,我们要懂得第三部分的作用,要懂得本地化数据和代码范围的好处和重要性。

    int testStatic()
    {
     int x=1;
     x++;
     return x;
    }
    main()
    {
     int i;
     for(i=0;i<5;i++)
     printf("%d/n",testStatic());
    }

    输出为:

    2

    2

    2

    2

    2

     

    int testStatic()
    {
     static  int x=1;
     x++;
     return x;
    }
    main()
    {
     int i;
     for(i=0;i<5;i++)
     printf("%d/n",testStatic());
    }

    输出为:

    2

    3

    4

    5

    6

    const 有什么用途?

    1)可以定义 const 常量

    2const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
      const意味着"只读"。区别如下代码的功能非常重要。

    const int a;
    int const a;
    const int *a;
    int * const a;
    int const * a const;
    • 前两个作用是一样的,a是一个常整型数。
    • 第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
    • 第四个意思是a是一个指向整型数的常指针(也就是,指针指向的整型数是可以修改的,但指针是不可修改的)。
    • 最后一个意味着a是一个指向常整型数的常指针(也就是,指针指向的整型数是不可修改的,同时指针也是不可修改的)。


      (1)关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于"输入参数"。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,清晰的辨别哪些是输入参数,哪些是可能的输出参数。

      (2)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。

      const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:"只能读的普通变量",可以称其为"不能改变的变量"(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以#define宏定义!故在C语言中如下程序是非法的:

    const int SIZE = 10;
    char a[SIZE]; /* 非法:编译阶段不能用到变量 */

    以下是工作中的使用const例子:

    const unsigned char *  pbyData;

    unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
    31, 31, 30, 31, 30, 31 } ;

    extern void dp_write_dsp_block ( const word *bp, word len );

    const unsigned short  cnstUni2InterMapSparseIdx[];

    volatile问题:

    volatile的语法与const是一样的,但是volatile的意思是“在编译器认识的范围外,这个数据可以被改变”。不知何故,环境正在改变数据(可能通过多任务处理),所以,volatile告诉编译器不要擅自作出有关数据的任何假设——在优化起家这是特别重要的。如果编译器说:“我已经吧数据读入寄存器,而且在没有与寄存器接触。”在一般情况下,它不需要再读入这个数据。但是,如果数据是volatile修饰的,编译器则是不能做出这样的假定,因为数据可能被其他进程改变了,编译器必须重新读这个数据而不是优化这个代码。就像建立const对象一样,程序员也可以建立volatile对象,甚至还建立const volatile对象。这个对象不能被程序员改变,但可通过外面的工具改变。

        volatile对象每次被访问时必须重新读取这个变量的值,而不是用保存在寄存器中的备份。下面时volatile变量的几个例子:

        .并行设备的硬件寄存器(如状态寄存器);

        .一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);

        .多现成应用中被几个任务共享的变量。

    一个参数可以const同时也是volatile,一个指针也是可以为volatile的,但是具体编程时要小心,要保证不被意外修改。

  • 相关阅读:
    【转】c语言中的#号和##号的作用
    stm32 HAL库编程驱动控制文件<stm32f1xx_hal_conf.h>的使能方法
    rt-thread是如何做到通过menuconfig配置将相应文件加入工程和从工程中除去
    rt-thread 学习路线
    stm32使用rt-thread在文件《stm32f1xx_hal.h》中头文件包含顺序引出的错误
    rt-thread之stm32系列BSP制作方法
    使用rt-thread中BSP-stm32 ENV构建工具报错
    rt-thread中动态内存分配之小内存管理模块方法的一点理解
    内存对齐
    rt-thread中线程内置定时器的作用 ---
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298798.html
Copyright © 2020-2023  润新知