关键字的总结

一、关键字volatile

编译器的优化:因为访问寄存器要比访问内存要快的多所以编译器一般都会减少存取内存的的优化,将内存变量缓存到寄存器。使用关键字volatile声明变量的时候,表示变量随时可以改变,系统总是重新从他所在的内存读取数据,也可以这么理解当使用关键字volatile时编译器就不在对该变量进行优化。

1) 并行设备的硬件寄存器(如:状态寄存器)

假设需要对寄存器依次初始化为不同的值

int  *output = (unsigned int *)0xff800000;//定义一个IO端口;

int  init(void)

{

     int i;

     for(i=0;i<10;i++){

        *output = i;

}

}

经过编译器优化后,编译器认为前面循环半天都是废话,对最后的结果毫无影响,因为最终只是将output这个指针赋值为9,所以编译器最后给你编译编译的代码结果相当于:

int  init(void)

{

     *output = 9;

}

2) 一个中断服务子程序中会访问到的非自动变量要用volatile修饰

static int i=0;

intmain(void)

{

    ...

    while (1){

     if(i) dosomething();

    }

 

voidISR_2(void)

{

     i=1;

}

如果没有static volatile int i = 0;每次if语句判断只使用寄存器中“i副本”

3) 多线程应用中被几个任务共享的变量

当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致

当变量在因别的线程等而改变了值,该寄存器的值不会相应改变

二、关键字static

1在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 
2在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 
3在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

4静态数据成员可以被一个类的n个对象共有,实现数据共享。在内存中只占一份空间,即使这个类没有定义对象,静态数据成员也会被分配空间。它不随对象的建立而分配空间,也不会因为对象的撤销而释放,程序结束时释放。访问静态数据成员:数据类型类名::静态数据成员名 (对象不存在了可以访问)

5静态成员函数没有this指针而非静态成员函数有this指针,所以不能访问这个类对象的非静态成员,可以直接访问这个类中的静态成员。

访问静态成员函数:数据类型类名::静态成员函数

三、关键字extern


const 可以定义常变量,#define可以定义常量

const 定义的有数据类型的,编译器可以对他进行类型安全检查。#define定义常量,只进行简单的替换,没有类型检查。

typedef P char *; P a,b;

#define P char *; P a,b;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值