存储类常用关键字与链接属性

存储类常用关键字:
auto关键字:
用来修饰局部变量,表示这个局部变量是自动局部变量,分配在栈上;平时定义局部变量时就是定义的auto的,只是省略了auto。
static关键字:
1、用来修饰局部变量(改变存储类性质),表示静态局部变量分配在数据段/bss段上。非静态局部变量分配在栈上。
2、用来修饰全局变量(改变链接属性),静态全局变量链接属性为内链接,非静态全局变量链接属性为外链接。
静态局部变量和全局变量:
静态局部变量和全局变量在存储类方面一样;
静态局部变量和全局变量在生命周期一样;
静态局部变量作用域是代码块作用域(和普通局部变量一样)、链接属性为无链接和全局变量作用域是文件作用域(和函数一样)、链接属性为外链接。
register关键字:
修饰变量时,编译器会尽量将它分配到寄存器中,用于提高访问效率。但是寄存器的数量是有限的,一般慎用。
extren关键字:
用来声明全局变量,声明的目的是为了在一个文件中使用另外一个文件定义的变量。
eg:在a.c中使用b.c中定义的变量,就需要在a.c中用extren声明该变量。
volatile关键字:
用来修饰一个变量,表示这个变量可以被编译器之外(例如:中断isr中引用的变量、多线程中共用的变量、硬件会改变的变量)的东西所改变。
编译器遇到volatile修饰的变量时,就不会对变量进行优化(优化的意思是编译器会自动将一些它认为无意义的一些操作去掉),就不会出现因为优化而出现的错误。
链接属性:
C语言规定在作用域交叠范围内,作用域小的一个变量会遮蔽掉作用域大的那个(县官不如现管)。
全局变量所占用的内存是不能被程序自己释放的,所以程序如果申请了过多的全局变量会导致这个程序一直占用很大的内存。
程序由源码到可执行程序,经过了编译和链接的过程。编译阶段就是把源文件编程.o目标文件,目标文件中有很多符号和代码段、数据段、bss段等分段。符号就是编程中的变量名、函数名等。.o的目标文件链接生成可执行程序时,其实就是把符号和相应的段链接起来。
通俗来讲链接就是将各个独立分开的二进制函数链接起来形成一个整体的二进制可执行程序。
编译以文件为单位,链接以工程为单位。
三种链接属性:
1、外链接:外链接属性的函数或变量可以在整个程序范围内进行链接(例如:普通函数和全局变量)。
2、内链接:内链接属性的函数或变量可以在当前c文件内部范围内进行链接,不能在当前c文件以外的其它c文件中进行访问,链接。(例如:static修饰的函数/全局变量)
3、无链接:不是不参与链接,(例如;普通局部变量和static修饰的局部变量)。
链接属性的目的:
不同的链接属性是为了解决函数/全局变量重名的难题。
一些值得注意的地方:
1、加上extren就是明确声明这个变量为外链接属性。
2、全局变量应该定义在c文件中,并在头文件中进行声明,不要定义在头文件中。
3、在b.c中引用a.c中定义的全局变量/函数的两种方法:
一、在a.h中声明该函数/全局变量,然后在b.c中/#include<a.h>;
二、在b.c中使用extren显示声明要引用的函数/全局变量。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值