一、标识符的作用域与可见性
1.作用域分为两种:
1.局部作用域:局部作用域里声明的标识符(局部变量)只能作用于所在的{}里,(栈区)
2.全局作用域:独立在任何{}外的变量称为全局变量,范围为从定义到程序结束(静态区)
通过全局变量可以实现函数传参(尽量少用)
所有函数的函数名具有全局作用域
局部变量未初始化为随机数,全局变量未初始化为0(位清零)
2.可见性:
1.标识符必须先定义再使用
2.在同一作用域中不能定义同一标识符
3.在没有包含关系的作用域中定义的同名标识符互不影响
4.在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见(就近原则)
二、变量生存期:变量从产生到毁灭的时间
1.静态生存期:生存期直到程序结束为止(全局变量)
用static关键词修饰的局部变量(将局部变量的动态生存期变为静态生存区)
2动态生存期:除静态生存期外,其余均为动态生存期(存在于栈区)
3.auto变量:自动变量,其空间开辟与毁灭均为自动
4.register变量:寄存器变量,将变量定义为寄存器变量,提高读写速率(建议非命令)
5.extern(局外声明变量):extern 为声明,定义只有一次,声明有无数次
6.头文件:其中只放声明,不放定义(不参与编译)
函数形参名可以省略,但一般需要标记清楚
函数前加static表明只能在本.c文件中使用,即使声明也无效
三、预处理命令
1、编译过程: 编辑 ----预处理----编译-----链接-----运行
2.宏定义:gcc -E 要求编译器只做预处理,不编译
3.不带参宏:#define标识符 字符串
本质:在预处理阶段,将所有的宏替换为数值(无脑替换,不做任何运算处理),宏定义不加分号
4.带参宏:#define宏名(参数表) 字符串
本质:也是无脑替换(其中括号越多越好)
带参宏效率高于函数,但会占用大量内存空间
5.文件包含处理:带#均为文件包含命令(无脑替换)
6.条件编译:#if 0/1 #endif(注释作用) 0:代码无效 1:代码有效
7.ifdef标识符(宏名):
预处理阶段,会在程序段1观察宏名是否定义过,若没有定义,则为无效,执行else
调试部分
#ifndef 与#ifdef 相反