作为在嵌入式底层搬砖两年的一个embeder,最近两度被xxx提问关于关键字的用法提问住了,于是回来马上对嵌入式C中的关键字做一个总结和框图化整理。
C语言中关键字:auto、extern、static、 register、const、volatile、_Thread_local(多线程,并发用到)、_Atomic(多线程,并发用到)
auto 变量:
声明在块或者函数头中的任何变量都属于自动存储类别。 当然也可以用关键字auto. 需要注意的是,auto定义的变量需要
显式的初始化,不然其值是一个取值范围内的任意值,千万别指望是0!。
int main(void)
{
int repid; //auto定义的变量需要显式的初始化,不然其值是一个取值范围内的任意值;
int tents = 5;
}
register变量:
与普通变量相比,register的访问和处理速度更快。但是寄存器变量是无法获取其地址的,因为其不是存在内存中。
和auto一样,具有块作用域,无链接,和自动存储期;
static变量:
int paramater1; // 具有外部链接的静态存储期,其他文件使用要用extern申明;
static paramater2; // 具有内部链接的静态存储期,其他文件不可使用;
int function(void)
{
static int paramater3; //无链接的静态存储期, 内存会一直存在,但出了该函数后程序后就不能使用了。
}
const 和 volatile :
const 其值不能通过赋值,递增,递减修改;
1)const进行指针的限定:
const float *pf; //pf指向一个float类型的const值;指向的值是不能改变的,而pf本身是可以改变的。
float * const pf; //pf指向一个float类型的const值;创建的指针Pt不能改动,pt必须指向同一地址,但它所指向的值可以改变;
const float *const ptr; //pf指向一个float类型的const值;创建的指针Pt不能改动,pt必须指向同一地址,它所指向的值也不可以改变;
// 总结:const 放置在*之前,指的是指针不能改,放置在*之后,说明地址的数据不能改。
2)const 修饰实参,保证数据传递过程中数据不会被更改:
void display(const int array[], int limit);
3) const 修饰全局变量:
全局变量的一个缺点就是暴露数据,其他任何部分的程序都可以对其进行修改,因此用const修饰是一个不错的选择。
const 和 volatile :
volatile 限定符告知计算机,代理(非变量所在的程序)是可以改变其变量的值。最常用的用法是在硬件地址及其他程序或者同时运行的线程中共享数据。
好处在于:告诉编译器不能对此变量进行优化;