C提供的预处理功能主要有以下3种:
1. 宏定义
2. 文件包含
3. 条件编译
分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。
用一个指定的标识符(即名字)来代表一个字符申,它的一般形式为
#define 标识符 字符串
这就是已经介绍过的定义符号常量,例如:
#define PI 3.1415926
它的作用是在本程序文件中用指定的标识符 PI 来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有的 PI 都用“3.1415926”代替。
这种方法使用户能以一个筒单的名字代替一个长的字符串,因此把这个标识符(名字)称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。#define 是宏定义命令。
带参数的宏定义:不是进行简单的字符串替换,还要进行参数替换。其定义的一般形式沩
#define 宏名(参数表)字符串
字符串中包含在括号中所指定的参数。
文件包含
所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。C语言提供了#include 命令用来实现“文件包含”的操作。其一般形式为
#include <文件名> 或 #include "文件名"
注意:在编译时并不是对两个文件分别进行编译,然后再将它们的目标程序连接的,而是在经过编译预处理后将头文件 format. h 包含到主文件中,得到一个新的源程序,然后对这个文件进行编译,得到一个目标(.obj)文件。被包含的文件成为新的源文件的一部分,而单独生成目标文件。
一般情况下,源程序中所有行都参加编译。但是有时希望程序中一部分内容只在满足一定条件时才进行编译,也就是对这一部分内容指定编译的条件,这就是“条件编译”。
有时,希望在满足某条件时对某一组语句进行编译,而当条件不满足时则编译另一组语句。
(1)
它的作用是若所指定的标识符已经被# define 命令定义过,則在程序编译阶段樂译O1程序段1;否则编译程序段2。其中#else 部分可以没有,即
(2)
只是第一行与第一种形式不同:将“ifdef”改为“ifnde”。它的作用是若标识符未被定义过则编译程序段1;否则编译程序段2。这种形式与第一种形式的作用相反。
(3)
它的作用是当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定条件,使程序在不同的条件下执行不同的功能。