C51开发中的static, const, code关键字

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;
}

上面的全局变量iinit()函数, 只能用在当前文件中可用, 全局变量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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值