预处理的三种用途:
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
用来解决(防止)重复定义。
作者:
韩兆新
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。