局部变量和全局变量
标识符的作用域和可见性
作用域
全局作用域、局部作用域
作用域允许存在包含关系,所有的局部作用域被包含在全局作用域里,局部作用域也可以包含局部作用域。
g 是全局变量
#include<stdio.h>
int g;
int main(void)
{
int i ;
{
int j;
}
return 0;
}
如果用全局变量传参,耦合性太高,尽量用形参传参。
如果全局变量未被初始化,其值为0,而不是随机数。在全局区的变量如果未被初始化,都为0。
可见性
1.标识符必须先定义在使用;
2.同一作用域中不得出现同名标识符;
3.在没有包含关系的不同作用域中,定义同名标识符,互不影响;
4.在两个或两个以上具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见。
变量的生存期
静态生存期:全局变量具有静态生存期,与程序运行周期相同,空间开辟时间在第一条语句之前,空间销毁在最后一条语句之后。 全局变量,static修饰的局部变量。
动态生存期:在栈区的,局部变量、形参.
stctic + 全局变量\函数 限制使用范围仅本身.c文件可以使用
关键字
auto 关键字
自动的,可以被省略
register 关键字
寄存器,在CPU内部
register int i; 提高效率; 建议并不是命令
由register修饰的变量不可以取地址
:vsp func.c 分屏
:set mouse=a
:sp func.h 头文件中只放声明,不放定义
在func.h 只放声明,全局变量或者函数
用extern声明外部变量
在extern后面的是声明,不是定义
预处理命令
可以改进程序设计环境,提高编程效率
宏定义
不带参宏
#define 标识符 字符串
宏名所有的字母都大写
gcc -E 通知编译器只做预处理命令不编译
宏定义最后不加分号
程序的行数,程序的文件名
带参宏
#dedine ADD(a,b) a + b
int main(void)
{
printf("%d\n",ADD(10,20));
return 0;
}
带参宏跟函数有本质的区别:带参宏效率高,但是代码复用性低
(宏函数的说法❌)
延迟包含:尽量在源文件包含
“文件包含”处理
一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件包含到本文件中。
一般形式为:
#include<文件名> 或者#include"文件名"
头文件除了可以包括函数原型和宏定义外,也可以包括结构体类型定义和全局变量定义。
条件编译
1.#if 0
#endif
2.#ifdef 标识符(不带参宏)
#endif
int main(void)
{
#ifdef k
puts(""hello);
#endif
puts("world");
return 0;
}
如果之前没有被定义K,puts("Hello")为假,不打印
3.#ifndef
#endif 如果没有定义过,为1
防止重复包含造成的错误