35 C语言的限定符二
控制变量的作用域和范围
auto :默认存储位置.等于没写 蛋疼
register : 声明变量保存位置在寄存器中,已过时,没啥人用,蛋更疼
static :两种情况 1.子程序内部的长期变量,程子程序退出也不会销毁,
2.文件级变量,让变量或者程序限定在这个c文件内
extern :
- 只是声明,不是定义:
extern不会给变量分配内存,它只是告诉编译器这个变量在别的地方有定义,你可以用它
- 可以跨文件访问:用来实现不同
.c文件之间共享全局变量 / 函数
- 函数默认是 extern 的:你平时写的函数声明,默认就是
extern的,所以你写 void func();和 extern void func();是完全等价的
代码示例:跨文件共享变量
// file1.c:定义全局变量
int global_num = 100; // 定义,分配内存
// file2.c:使用其他文件的全局变量
#include <stdio.h>
// 声明这个变量是外部的,告诉编译器它在别的文件里
extern int global_num;
int main() {
printf("全局变量的值是:%d", global_num); // 正常输出100
return 0;
}
针对Keil C251编译器(适配STC等增强型8051单片机),static修饰的变量存储位置需结合单片机内存架构和编译器设置,核心规则如下,与通用C语言的静态存储区逻辑一致,但对应具体物理内存区域更明确:
C251环境下static变量的具体存储位置
C251编译器针对8051架构(含STC32G等增强型芯片)的内存特点,static变量仍属于静态存储区,但会根据单片机内存类型(片内/片外)和编译器内存模型,分配到具体的物理内存区域,核心分两种情况:
1. 默认情况(编译器自动分配)
C251提供3种内存模型,不同模型下,static变量的默认存储区域不同(优先分配到访问速度更快的片内内存):
- Small模型(推荐常用):默认将
static变量分配到片内data区(片内RAM低128字节),访问速度最快,适合高频访问的小体量static变量(如计数器),但空间有限。
- XSmall模型(兼容旧项目):传统8051中默认分配到片内data区;现代增强型8051(如STC32G)中,编译器会优先将
static变量分配到片内edata区(扩展片内RAM),这是STC芯片新增的高速片内内存,访问速度接近data区,空间比data区更大(通常几K~几十K)。
- Large模型:默认将
static变量分配到片外xdata区(外部扩展RAM,最大64KB),适合体量较大的static变量(如大数组),但访问速度比片内内存(data/edata)慢,需通过DPTR间接寻址。
2. 手动指定存储位置(精准控制)
无论使用哪种内存模型,都可手动指定 static变量的具体存储区域,适配不同场景需求,格式如下:
// 1. 存放到片内edata区(高速扩展内存,优先推荐)
static edata int static_edata_var = 10;
// 2. 存放到片外xdata区(适合大体量变量)
static xdata char static_xdata_buf[1024];
// 3. 存放到片内data区(高速小内存,适合高频访问)
static data int static_data_cnt = 0;
补充说明:C251中 static变量的“静态特性”(生命周期贯穿程序全程、值可保留)不变,仅物理存储位置适配8051架构的内存分区;对于STC32G等新型芯片,edata区可支持32位访问,xdata区虽对外显示16位,但芯片内部为32位设计,可满足更大体量static变量的存储需求。