目录一、作用域和生命周期1.1作用域1.2生命周期二、static2.1修饰局部变量2.2修饰全局变量2.3修饰函数三、extern一、作用域和生命周期1.1作用域作用域限定代码中所用名字的可用性范围1.局部变量的作用域是变量所在的局部范围2.全局变量的作用域是整个过程1.2生命周期生命周期变量的创建到销毁的一个时间段1.局部变量的生命周期进入作用域变量创建生命周期开始离开作用域生命周期结束2.全局变量的生命周期代码的整个过程二、staticstatic是静态的意思可以修饰2.1修饰局部变量图1中局部变量 i 每次进入print函数先创建变量并赋值0离开函数被销毁图2中局部变量 i 创建好之后离开函数不被销毁重新进入函数会依据上次的结果static修饰改变了变量的生命周期实质是改变了变量的存储类型将存储在内存栈区的变量存储到静态区和全局变量一样生命周期和程序的一样但是作用域不变。变量出了函数后想保留值等下次进入函数继续使用用 static 修饰。2.2修饰全局变量1.extern声明外部符号在add.c中定义在text.c中使用时用extern声明2.全局变量被extern修饰使全局变量只能在本文件text.c中使用否则编译报错。全局变量默认具有外部连接属性在外部文件使用时有声明即可但是被static修饰后外部连接属性变成内部连接属性只能自己使用。全局变量只在自己的源文件内部使用不想被其他文件发现用 static 修饰2.3修饰函数修饰函数和修饰全局变量一样函数被static修饰后只能自己使用。函数只在自己的源文件内部使用不想被其他文件发现用 static 修饰三、externextern关键字声明其他文件中的一个变量或函数变量和函数在某个文件中被定义定义变量时分配内存声明变量时不分配内存。// add.c int year 2026; // 定义全局变量 // text.c extern int year; // 声明外部变量函数本身具有外部连接属性但是声明可以更好理解// add.c void add() { printf(%d\n,ab); } // text.c extern void add(); // 显式声明外部函数
理解变量作用域与static、extern关键字
发布时间:2026/6/3 7:38:28
目录一、作用域和生命周期1.1作用域1.2生命周期二、static2.1修饰局部变量2.2修饰全局变量2.3修饰函数三、extern一、作用域和生命周期1.1作用域作用域限定代码中所用名字的可用性范围1.局部变量的作用域是变量所在的局部范围2.全局变量的作用域是整个过程1.2生命周期生命周期变量的创建到销毁的一个时间段1.局部变量的生命周期进入作用域变量创建生命周期开始离开作用域生命周期结束2.全局变量的生命周期代码的整个过程二、staticstatic是静态的意思可以修饰2.1修饰局部变量图1中局部变量 i 每次进入print函数先创建变量并赋值0离开函数被销毁图2中局部变量 i 创建好之后离开函数不被销毁重新进入函数会依据上次的结果static修饰改变了变量的生命周期实质是改变了变量的存储类型将存储在内存栈区的变量存储到静态区和全局变量一样生命周期和程序的一样但是作用域不变。变量出了函数后想保留值等下次进入函数继续使用用 static 修饰。2.2修饰全局变量1.extern声明外部符号在add.c中定义在text.c中使用时用extern声明2.全局变量被extern修饰使全局变量只能在本文件text.c中使用否则编译报错。全局变量默认具有外部连接属性在外部文件使用时有声明即可但是被static修饰后外部连接属性变成内部连接属性只能自己使用。全局变量只在自己的源文件内部使用不想被其他文件发现用 static 修饰2.3修饰函数修饰函数和修饰全局变量一样函数被static修饰后只能自己使用。函数只在自己的源文件内部使用不想被其他文件发现用 static 修饰三、externextern关键字声明其他文件中的一个变量或函数变量和函数在某个文件中被定义定义变量时分配内存声明变量时不分配内存。// add.c int year 2026; // 定义全局变量 // text.c extern int year; // 声明外部变量函数本身具有外部连接属性但是声明可以更好理解// add.c void add() { printf(%d\n,ab); } // text.c extern void add(); // 显式声明外部函数