以#开头的命令为预处理命令,如#include <stdio.h>, #define PI 3.1415926等
预处理命令一般都放在源文件的前面,并在函数之外,被称为预处理部分
无参宏定义:#define 标识符 字符串;
1.宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换
2.宏定义不是说明或语句,再行末不必加分号
3.宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束(如要终止其作用可使用#undef命令)
4.宏名在源程序中若用括号括起来,则预处理程序不对其作宏代换
5.宏定义允许嵌套
6.宏名一般用大写字母表示
7.可用宏定义表示数据类型
8.对输出格式作宏定义,可减少书写次数
宏定义表示数据类型和用typedef定义数据说明符的区别:
宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,
而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能
带参宏定义:#define 宏名(形参表) 字符串
C语言允许宏带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参
带参宏调用: 宏名(实参表);
例:
#define M(y) y*y+3*y /*宏定义*/
......
k = M(5); /*宏调用*/
......
1.带参宏定义中,宏名和实参表之间不能有空格出现
2.在带参宏定义中,形参不分配内存单元,因此不必做类型定义,宏调用的实参有具体值,需要用来代换形参,因此必须作类型说明
3.在宏定义中的形参是标识符,而宏调用中的实参可以是表达式
4.在宏定义中,字符串内的形参通常要用括号括起来以避免出错
5.带参的宏和带参函数相似但不同
6.宏定义还可以定义多个语句
strcat()函数:粘贴一个字符串
文件包含
1.一个include命令只能指定一个被包含文件
2.文件包含允许被嵌套
3.包含的文件名可以用双引号括起来(表示在源文件目录中去查找,找不到再去包含文件目录),也可以用尖括号括起来(表示在包含文件目录中去查找)
条件编译
推荐预处理的条件编译,如:
#if(0)
......
#endif
条件编译三个不成文的规则
1:如果标识符已被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译(程序段2可以没有)
#ifdef 标识符
程序段1
#else
程序段2
#endif
2:1的反过来版,对于不确定是否有定义过宏名有奇效
#ifndef 标识符
程序段1
#else
程序段2
#endif
3.啥都不说了,你懂的
#if 常量表达式
程序段1
#else
程序段2
#endif