2.1文件的包含
为了使编写的程序结构优良,更易于调试和阅读,需要灵活使用预处理。
#include""
#include<>
2.2宏定义
宏替换:在预处理阶段用预先定义的字符串代替标示符的过程
#define 标示符 字符串
标识符都大写
注意:
1宏替换不做语法检查,
2宏替换通常在文件开头部分,用#undef命令终止宏定义的作用域。
3不要在字符串中使用宏。
4该加()的时候加();
2.2.2带参数的宏替换
#define 宏名(参数表) 字符串
注意:
1、宏名和参数表之间不能有空格;
2、宏替换只做替换;
3、函数调用在编译后程序运行时进行,分配内存,宏替换在编译前进行,不分配内存;
4、宏的哑实结合类似于函数调用过程中实参代替形参的过程,不存在类型,也没有类型转换;
5、宏展开使源程序边长,而函数调用则不会。
2.2.3嵌套宏替换
在一个宏定义中使用另外一个宏
#define N 3
#define N_CUBE N*N*N
#define CUBE_ABS ((N_CUBE >0)?(N_CUBE : -1*(N_CUBE))
嵌套宏替换在预处理阶段进行扩展的时候是逐层进行的,以上面的CUBE_ABS为例,在已处理阶段将对其中的每个宏名进行扩展,直到没有宏名为止。
2.3宏定义常见的错误分析
#define INT_P int *
结果在声明 的时候
INT_P p , p1;
这时候P1并没有定义成我们想要的整形指针,而是一个整形变量。
-----------------------
#define N 10
Printf(“N的值为%d”,N);
报错,因为扩展后 为Printf(“N的值为%d”,N;); 多了一个; 分号
-----------------------
不要在字符串中用宏,否则会被编译器按照字符串来处理!
2.3.2带参数的宏
#define SUM(x,y) x+y void main() { int x=6; int y=9; int s=SUM(x,y); printf("x+y的值:%d",s); return; } 输出结果: printf("x+y的值:15 将代码:int s=SUM(x,y);修改为int s=SUM(x,y)*10; 输出结果: printf("x+y的值:96 为什么出错,本应该150的 因为扩展后为int s=x+y*10; 将宏定义该一下:#define SUM(x,y) (x+y) 这样就对了。