static关键字
static
在C里面可以用来修饰变量, 也可以用来修饰函数
static修饰变量
变量在C里面可以存在三处: 全局数据区, 栈和堆. 堆和栈是不同的.
int a ;
int main() {
int b ;
int c* = (int *)malloc(sizeof(int));
}
上面的代码中, a
是全局变量, b
是栈变量, c
是指向堆变量的指针
static
对全局变量的修饰: 限制了只能是本文件引用此变量. 有的程序由多个C文件组成, 可以互相引用变量, 但加入static
修饰之后, 只能被本文件中函数引用.static
对栈变量的修饰: 栈变量的生命周期延长到程序执行结束时. 一般来说, 栈变量的生命周期由OS管理, 在退栈的过程中, 栈变量的生命也就结束了, 但加入static
修饰之后, 变量已经不再存储在栈中, 而是和全局变量一起存储. 只是作用域为当前函数, 离开定义它的函数后不能使用, 但是再次调用这个函数时, 它又可以继续使用, 而且保存了前次的值.
static修饰函数
static
对函数的修饰与对全局变量的修饰相似, 只能被本文件中的函数调用, 不能被同一程序其它文件中的函数调用
static int i; //只在当前文件中可用
int j; //在工程中可用
static void init() { //只在当前文件中可用
}
void callme() { //在工程中可用
static int sum;
}
上面的全局变量i
和init()
函数, 只能用在当前文件中可用, 全局变量sum
的作用域只在callme()
函数里, 变量j
和函数callme()
的可见度是整个工程, 可以在另一个C文件中用extern
关键字调用. extern
用于告诉编译器这个变量或者函数在其他文件里已经被定义了.
extern int j; //调用a文件里的
extern void callme(); //调用a文件里的
int main() {
callme();
}
extern
的另一个用法是, 当C和C++混合编程时, 如果C++调用的是C源文件定义的函数或者变量, 那么要加extern
来告诉编译器用C方式命名函数.
文件A.cpp调用前面文件里面定义的变量i
和函数callme()
:
extern "C" //在c++文件里调用c文件中的变量
{
int j;
void callme();
}
int main() {
callme();
}
使用规则
只需要在当前文件中访问的变量和方法, 都可以将其定义为static
类型, 以降低命名冲突的风险
const, code 关键字
- 用
const
定义的变量和其数据一起, 存储在RAM区 (data, idata, xdata, 等等). 如果你希望存在ROM区, 需要用code
类型声明, 例如:
code char test[] = "This is a text string";
- 用
const far
声明的变量存储在 HCONST 内存区, 这个区通常是在ROM里. - STRING 这个编译变量指定字符串常量存储的位置, 这个配置允许你将其放在 CODE, HCONST, 或 XCONST (XDATA 中的常量区).
对于任何大的查找表,都应该声明为code
, 例如
code unsigned char default_base_fuel_PW_map[] = {0x08,0x08, ...} ;
参考
- https://www.keil.com/support/man/docs/c51/c51_le_const.htm