预处理的三种用途:
1)处理宏常量及宏函数;
2)合并(include)源文件;
3)条件性编译。
(一)#define和#undef
宏常量
格式:
#define 别名 常数或符号
#define与typedef的区别:
typedef char* STRING; STRING pc1,pc2;
这意味着pc1,pc2都是STRING类型的变量。
#define STRING char* STRING pc1,pc2;
这意味着pc1是字符指针变量;pc2是char类型的变量。
带参数的宏
文字取代;
1)一般用法
#define CLASS(type) struct type CLASS(book) { int pages; double length; double width; }
处理后变成为:
struct book { int pages; double length; double width; }
2)跨行的宏
使用“\”可将宏定义切分为数行。
如:
//第一个宏 #define CLASS(type)\ struct type\ { //第二个宏 #define END\ }; //使用宏 CLASS(book) int pages; double length; double width; END;
预处理后:
struct book { int pages; double length; double width; };
3)##的用法
//定义宏 #define FUN(type)\ type * type_function() //使用宏 FUN(int) { }
预处理后:
int * type_function() { }
type_function是一个完整的名称,其中的type并不是参数。
//定义宏 #define FUN(type)\ type * type##_function() //使用宏 FUN(int) { }
预处理后:
int * int_function() { }
type##表明此type是参数。
定义数学表达式:
1)表达式必须用小括号括住;
2)参数必须用小括号括住;
3)参数中避免出现“++”“—”。
例:
#define max(x,y) ((x)>(y) ? (x):(y)) #define max3(x,y,z) max(max(x,y),(z))
#undef (取消宏)
#define PI 3.1415926 #undef PI
#define ~ #undef 说明宏的有效范围
(二)条件性编译
#if 宏常量 #else #endif
条件编译的用途:
1)提高查错能力;
2)增加程序的可移植性。
(三)条件性定义
#ifdef 宏 #ifndef 宏 #endif #else
用来解决(防止)重复定义。