一、宏定义
1. 不带参数的宏定义说明
(1)宏名一般使用大写字母,以便与变量名进行区别;
(2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量;
(3)宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检查;
(4)宏定义不是C语句,末尾不加分号;
(5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束;
(6)用#undef命令终止宏定义的作用域;
(7)进行宏定义时,可以引用已定义的宏名,可以层层置换;
(8)对程序中用双撇号括起来的字符串,即使与宏名相同,也不进行替换;
(9)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。
2.带参的宏定义说明
(1)对带参的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参;
(2)在宏定义时,在宏名与带参数的括弧之间不应加空格。
3.带参的宏定义与函数的区别
(1)函数调用时,先求出实参表达式的值,然后代入形参,而带参的宏只是进行简单的字符替换;
(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元,而带参宏则是在编译前进行,在展开时并不分配内存单元,不进行值的传递处理,也没有返回值的概念;
(3)对函数中的实参和形参都要定义类型,二者的类型要求一致,不一致,应进行类型转换,而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可;
(4)调用函数只可得到一个返回值,而宏可以设法得到几个值;
(5)使用宏次数多时,宏展开后源程序长,因为每次展开一次都使程序增长,而函数调用不会使源程序变长;
(6)宏替换不占用运行时间,只占编译时间,而函数调用则占用运行时间(分配单元,保留现场,值传递,返回)。
二、文件包含
文件包含的方式有:
(1)#include
(2)#include "file.h"
区别在于第一种是到系统存放C库函数头文件所在的目录中寻找要包含的文件,这是标准方式,第二种是系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。
三、条件编译
1. #ifdef 标识符
程序段1
#else
程序段2
#endif
2. #ifndef 标识符
程序段1
#else
程序段2
#endif
3. #if 表达式
程序段1
#else
程序段2
#endif
阅读(631) | 评论(0) | 转发(0) |