预处理的三种用途:
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
用来解决(防止)重复定义。