在C程序中的“预处理命令”,是由ANSI C规定的,但不属于C语言的组成部分,因为编译程序不能识别他们,所以并不能直接对它们编译。在编译之前,程序需要对这些特殊的命令做些“预处理”。
宏定义
不带参数的宏定义
即用一个指定的标识符(即名字)来代表一个字符串,一般形式为#define 标识符 字符串 #define PI 3.14
在编译程序时的函数前定义PI,作用是在此程序中出现的PI都代替3.1415926,我们可以用一个简单的名字代替一个长长的字符串,所以就把这个标识符就是刚才提到的名字称为“宏名”,而把宏名代替字符串的过程成为“宏展开”。#define是宏定义命令。
(1) 宏名一般习惯用大写字母表示,以便与变量相区别,但这并不是规定,也可用小写代替。
(2)不必在宏定义后加分号,加了分号会连分号一起置换。
(3)#define的命令是在程序中函数的外面,宏名的有效范围是在本次程序结束前,而使用#undef命令可以结束宏定义的作用范围。
(4)在进行宏定义时,可以引用已定义的的宏名。例如:
#define R 3
#define PI 3.14
#define S 2 * PI * R
#define L PI * R * R
(5)对双撇号里括起来的字符串里的字符,即使与宏名相同,也不进行置换。
(6)宏定义只进行置换,不分配内存空间。
带参数的宏定义
带参数的的宏定义除了进行字符串替换还要进行参数替换。一般形式为#define 宏名 (参数表) 字符串
带参数的宏展开,就是将语句中的实参字符串代替给定义中的形参。
在宏定义时,在宏名与带参数的括号之间不赢家空格,否则将空格以后的字符都作为代替字符的一部分。文件包含
文件包含就是一个源文件将另一个源文件包含起来,执行时除了执行本文件的内容还要执行包含进来的文件。一般形式为
#include"文件名” #include<文件名>
使用文件包含可以减少程序员的工作量。
条件编译
一般情况下,程序中的所有行都要参加编译,但是有时只需要程序中部分内容参加编译,对于这部分内容指定变异的条件,被叫做“条件编译”。类似于条件语句。满足条件时执行这一组语句,不满足条件时执行另一组语句。
一般形式:
#ifdef标识符
程序段1
#else
程序段2
#endif
他的作用是若指定的标识符已经被定义过,则在程序编译阶段编译程序段1, 否则编译程序段2。
#ifndef标识符
程序段1
#else
程序段2
#endif
这种的作用是若标识符未被定义过,编译程序段1,否则编译程序段2。与上面那个作用完全相反。
#if 表达式
程序段1
#else
程序段2
#endif
这种作用是当指定表达式为真时编译程序段1,否则编译程序段2。