1、标识符的作用域与可见性
作用域分为两种:
局部作用域:
{},局部作用域里声明的标识符(局部变量)只能作用于所在的{}里,作用域外对标识符赋值将会报错(栈区)
全局作用域:
{}以外的,不放在任何{}里面的变量称为全局变量(例子 g_i),使用范围为从定义开始到文件结束(静态区)
通过全局变量也可以实现函数传参(尽量不用)
a,b与局部变量相同,都在栈区
add 具有全局作用域(所有函数的函数名)
局部变量未初始化为随机数,全局变量未初始化为0(位模式清0)
可见性:
1.标识符必须先定义再使用
2.在同一作用域中不能定义同一标识符
3.在没有包含关系的作用域中定义的同名标识符互不影响
4.在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见(就近原则)
变量的生存期:
变量从诞生到销毁的时间
静态生存期:
该变量的生存期与程序的运行周期相同
1.全局变量
2.用static(静态的)关键字修饰的局部变量
(将局部变量的动态生存期修改为静态生存期)
s_i 在静态区
与全局变量一样,未被初始化时为0
输出结果为11,12
初始化只做一次,第一次执行fn后s_i的空间未被销毁,第二次执行fn,输出结果为12
动态生存期:
除静态生存期外,其余的为动态生存期
程序结束时会被销毁(即在栈区)
auto变量:
即自动变量,变量的空间的开辟和销毁为自动的
register变量:
即寄存器变量,将变量定义为寄存器(存储器,CPU内部)变量,提高读写速率
register是一个建议,不是命令
i 有可能在CPU里,CPU内没有地址
用extern声明外部变量:
函数声明:
多文件编辑:
命令界面: :vsp + 文件名
set mouse=a 鼠标光标移动
编译:gcc -oapp 文件名(两个)
加上extern的那一行一定为声明
sp func.h
头文件中只放声明,不放定义
编译时头文件不参与编译
函数的形参名可以被省略,但一般要标记清楚
函数前加static 限制函数只能在本.c中使用,无法再其他.c中使用
预处理命令
编辑
预处理
编译
链接
运行
宏定义
gcc -E 要求编译器只做预处理,不编译
不带参宏:
本质:在预处理阶段,将所有的宏名,替换为数值(无脑文本替换)
宏定义后不加分号
带参宏:
本质:无脑文本替换
宏里面的括号越多越好
带参宏效率高于函数,但会占用大量内存空间
”文件包含“处理
带#都为文件包含命令
本质:无脑文本替换
绝对路径 :<>、 "" 无区别
相对路径:
文件包含命令后面使用<>,自动去/usr/include里面查找,使用“”,在自己的.c目录里面查找
条件编译
#if 0/1 #endif(注释作用)
0:代码无效
1:代码有效
ifdef 标识符(宏名)
预处理阶段,会在程序段1观察宏名是否定义过,若没有定义,则为无效,执行else
调试部分
#ifndef 与#ifdef 相反
规则:在所有的头文件里面
#ifndef FUNC_H
#define FUNC_H
声明
#endif