一.const
1.const作为数据类型的限定词,相当于定义了一个常量,故定义的时候一般就需要赋值,使用的时候,就是把数值赋给其他变量。
2.const作为指针的限定词,const可以固定指向(地址)或内容(值),原则如下:
以const为原点,*在const左边,表示值不可更改
*在const右边,表示指向不可更改

二.static
1.在函数外面定义,那么其那么其效果和全局变量类似,但是,static定义的变量只能在当前c程序文件中使用,在另一个c代码里面,即使使用extern关键词也不能访问这个static变量。

2.在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,这个static变量也不会再次被初始化,于是,这个变量的取值就会一直保存着,也就是说,当你再次调用这个函数的时候,里面用到这个static变量时,就会发现,还是它还是上一次函数调用时的结果,生命周期从程序启动过到结束。

三.extern
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern是全局变量申明,声明不是定义,即不分配存储空间。
3-1.extern的两种使用方式
也就是说,在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以有两种方式:
1.在头文件中extern声明变量,使用的时候include头文件

2.在其他文件中直接extern

3.2.extern"C"
使用C开发的模块,经常看到使用extern C 如下,是为了能够让C ++语言也能够调用输出(Export) 的函数,需要用extern "C" 来强制编译器不要修改你的函数名。

3.3.声明和定义知识点
1.定义也是声明,extern声明不是定义,即不分配存储空间。extern告诉编译器变量在其他地方定义了。
eg:extern inti; //声明,不是定义
inti; //声明,也是定义
2.如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。
eg:externdouble pi=3.1416; //定义
3.函数的声明和定义区别比较简单,带有{}的就是定义,否则就是声明。
eg:externdouble max(double d1,double d2); //声明
doublemax(double d1,double d2){}//定义
4.除非有extern关键字,否则都是变量的定义。
eg:extern inti; //声明
inti; //定义
注意点:
1. 不要把变量定义放入.h文件,这样容易导致重复定义错误。
2. 尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。
也就是说
3. 可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。
网友评论
const和define的区别
编译时刻:宏是预编译(编译之前处理);const是编译阶段
编译检查:宏不做检查,不会报编译错误,只是替换;const会编译检查,会报编译错误
宏的好处:宏能定义一些函数,方法,const不能
宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换