编译预处理的作用:
对源程序编译之前做一些处理,生成扩展C源程序。
种类 宏定义
#define 文件包含
#include 条件编译
#if--#else--#endif等
其他宏定义 #line #error #pragma
一、宏定义
无参的宏定义的
例: #define NUM 1
1、宏展开只做简单的替换,不做语法检查和运算;
2、为了运算结果没有歧义,建议宏体加上括号;
3、不带参宏定义的语法:#define 宏名 【宏体】
4、宏名建议大写,与变量区分;
5、宏体可以省略,表示该宏已经定义;
有参宏定义
例:#define S(a,b) a*b
宏展开:S(3,2)==3*2;
例#define S(a,b) a+b
S(3,2)*S(1,2)=3+2*1+2=7;
1、参数表和宏名之间不能有空格;
2、参数表不需要类型,只需要参数;
3、为了计算没有歧义,宏体中的所有参数以及整个宏体都要使用括号括起来。
二、条件编译
条件编译有3种形式
1、第一种形式:
(1)、第一种结构
#if 常量表达式
语句块
#endif
(2)、第二种结构
#if 常量表达式
语句块1
#else
语句块2
#endif
(3)、第三种结构
#if 常量表达式1
语句块1
#elif 常量表达式2
语句块2
#elif 常量表达式3
语句块3
.....
#else
语句块n
#endif
2、第二种形式
(1)第一种结构
#ifdef 标识符
语句块
#endif
只要define定义了,#ifdef才会执行语句块。
(2)第二种结构
#ifdef 标识符
语句块1
#else
语句块2
#endif
3、第三种形式
(1)第一种结构
#ifndef 标识符
语句块
#endif
如果标识符没有定义则执行语句块。
(2)第二种结构
#ifndef 标识符
语句块1
#else
语句块2
#endif
如果标识符已经定义,则走语句块2。