C语言关键字(cv限定及extern .static)
1.const的用法
const修饰过的变量通常是表示此变量为不可修改的
const int a;//int a 的值不可变
int const *p;//p指向地址的值不可变
int *const p;//p指向的地址不可变
const int *p;//等同于int const *p
2.volatile的用法
volatile 字面理解易变的,它就是用来修饰易变的数据。它适用于多线程与中断中共用的重要全局变量。用volatile修饰的变量编译器不得进行优化
伪代码来解释一下
int a = 0;//变量从内存中搬到寄存器,寄存器拿数据进行计算赋值,编译器会进行优化直接读取寄存器值导致结果出错
volatile int a = 0;//变量每次使用都要从内存中去拿存储,编译器不进行优化,所以结果永远和预想结果一致的。
中断函数
{
for(int i = 0; i < 100; i++)
a++;
b++;
}
线程a
{
for(int i = 0; i < 100; i++)
a--;
b--;
}
还比如有些端口值始终时固定的为了防止修改可以定义为
const volatile int port = 8001;
3.extern的用法
extern修饰过的变量,通常用作两个文件中共用的全局变量声明,在程序编译的链接过程中会把全局变量指明出位外部链接性质。
extern关键字只与链接有关他是声明,不可以用来定义。
例如:b.c使用a.c的全局变量
a.c
int a = 5;
b.c
extern int a = 6;//报错extern用于声明全局变量,不可用来定义。
extern int a;//正确
a = 6;
//如果不进行声明则会报出链接错误,找不到这个符号 。
修饰函数:全局声明的函数缺省extern,所以两个及多个文件访问外部文件函数时只需要添加相应函数声明所在的头文件,在头文件中包含函数声明即可。
4.static的用
static实质是将外部变量的链接属性由外部改变为“内部”staitic仅改变了变量的链接性质
static int a = 0;
//反汇编就可以看到缺少了
.glibo xxx
//而多出现了. local a表示了a只能在本模块内的代码访问
static 修饰类型作用域
类型 | 作用域 |
---|---|
函数内部变量 | 函数模块内 |
全局变量 | 只可本文件访问 |
函数声明 | 函数作用域为本文件 |
5.知识点
1.暂时定义优先级高于声明
extern int a;
static int a;
a = 1;
//a一定是本文件中static int a 所定义的变量
未完待续