嵌入式程序员对const、static、volatile的认识

嵌入式ARM 2019-03-04 17:22


摘要


在C语言程序编写中,const、static关键字是比较熟悉的,volatile关键字是比较少见的。但是在嵌入式工程开发中,const、static、volatile都是很常见的,我们嵌入式程序员需要熟知这三个关键字的恰当用法。下面是我参照网路上的大咖,大牛的博文,然后做一些代码测试,撰写一下自己的体会。欢迎大家一起交流讨论。

const


const修饰的变量是常变量,只有读权限,无写权限。read_only。修饰的函数是常函数。
几点认识:
const修饰的变量需要同时初始化


const int a;


[Error] uninitialized const ‘a’ [-fpermissive]
正确的是 const int a = 0;
数据类型对于const是透明的


int const a = 0; <=> const int a = 0;
const int *p1 = &a; <=> int const *p1 = &a


const用于封锁直接修饰的内容



关于const一个很有意思的demo:



这段代码是能够编译通过的,编译结果如下:



我们来看代码:const int *p1 = &a, 指针p1的指向可以修改,但是指向的内容不可修改。可以看到p1指向的地址和a一样,我们不能通过*p1的内容去修改a,但是修改a的内容却可以修改*p1。p1 = &b,表示指针指向可以改变,但是不能通过*p1改变b的内容,但是通过修改b的内容可以修改*p1。

static


static修饰的变量是静态变量,修饰的函数是静态函数。在C++中,修饰的变量也叫类变量,修饰的函数也叫类函数或类方法。这些变量或函数属于整个类。


在C中,static【局部】修饰函数体内的变量,可以延长局部变量的生命周期。函数一般是在栈中执行的,每一次调用,入栈出栈后变量都会经历定义到销毁,不会保存上一次的值。但是static修饰的变量是放在堆中,不会经历函数调用的生命过程。

static【全局】修饰函数体外的变量,或者修饰函数。都是只能在当前的源文件中被访问,其他的文件不能访问。当多个模块中有重名的对象出现时,不防用static修饰。

static修饰的变量没有初始化时,默认为0。

volatile


olatile修饰的变量是这变量可能会被意想不到地改变,这样编译器就不会假设这个变量的值了。精确地说,编译器优化的时候每次都从变量的内存地址读取,而不是从寄存器或者cache缓存中读取。以下是volatile使用的场合:
并行设备的硬件寄存器(状态寄存器)


一个中断服务子程序中会访问到的非自动变量,对线程任务中被几个任务共享的变量。

作者:OathKeeper_Sn
来源:CSDN
原文:https://blog.csdn.net/windsnow1/article/details/87929904


你怎么看?

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
热门推荐
相关推荐
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦