预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作
预处理是C语言的一个重要功能,它由预处理程序负责完成;当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译
C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等
宏定义
无参宏定义
其定义的一般形式为:
#define 标识符 字符串
对源程序作编译时,将先由预处理程序进行宏代换,然后再进行编译
对于宏定义还要说明以下几点:
- 宏定义是用宏名来表示一个字符串
- 宏定义不是说明或语句,在行末不必加分号
- 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束
- 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换
- 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名
- 可用宏定义表示数据类型,使书写方便
带参宏定义
带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
带参宏调用的一般形式为:
宏名(实参表);
带参的宏定义有以下问题需要说明
- 带参宏定义中,宏名和形参表之间不能有空格出现
- 形式参数不分配内存单元,因此不必作类型定义
- 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式
- 在宏定义中,字符串内的形参通常要用括号括起来以避免出错
- 宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内
文件包含
文件包含命令行的一般形式为:
#include”文件名”
- 包含命令中的文件名可以用双引号括起来
使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的),而不在源文件目录去查找;
使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式
- 一个include命令只能指定一个被包含文件
- 文件包含允许嵌套、
条件编译
- 第一种形式
#ifdef 标识符
程序段1
#else
程序段2
#endif
- 第二种形式
#ifndef 标识符
程序段1
#else
程序段2
#endif
- 第三种方式
#if 常量表达式
程序段1
#else
程序段2
#endif