预处理

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)
这样就对了。

 

  

 

 

 

 

posted @ 2013-01-17 01:23  Heri  阅读(230)  评论(0编辑  收藏  举报