预处理

概念:在编译之前进行的处理。 C语言的预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。 是程序员在编译以前用来操作源码文件内容的一种工具。

主要作用:通过预处理的内建功能对一个资源进行等价替换。

 

1、宏定义(宏替换)

预处理器在源码文件中根据用户定义的规则进行文本替换,用#define开头。格式如下:

#define PI  3.1415926  不带参

#define MAX(x,y) (((x)>(y))?(x):(y))

注意:

1、宏替换不是C++语句,行末不需要加分号

2、宏替换通常出现在程序的开头部分,有效范围从其定义命令后到本源文件结束。但是可以使用#undef命令来终止宏定义的作用域。

3、宏定义替换时可以使用已经定义的宏,并可以层层嵌套:

#define R 1.5

#define PI 3.14159

#define L 2*PI*R

4、程序中被双引号括起来的内容不会发生宏替换

5、宏替换与定义变量不同,宏图换只是做字符替换,并不分配内存空间

 

好处:

1、有效地简化程序中重复出现的某些复杂字符串的输入工作

2、增加程序的可读性

缺点:

只是简单地在源代码中将宏展开,不进行类型检查;

 

对于C++,使用const创建一个常量,它属于C++语言而非预处理器的特性。

 

 

2、文件包含

文件包含是C++预处理器允许源码文件使用共享代码的一种特性。它是指一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件包含到本文件中。

#include “文件名”:系统先在用户当前的目录中寻找要包含的文件,找不到才转到标准方式;

#include <文件名>:标准方式,系统到存放库函数头文件所在的目录中寻找要包含的文件;

处理#include指令时,预处理会自动的用指定的文件内容来替换该行内容

 

3、条件编译

引入#define预处理指示的另一个作用的是为了支持条件编译。通常,源文件中的所有内容都要参加编译,但是在某些时候,可能希望源文件中某些部分在满足某些条件按的情况下才进行编译,此即为“条件编译”。

语法如下:

第一种形式:

#ifdef  标识符

        程序片段1

#else

        程序片段2

#endif

如果标识符已经被#define命令定义过,则对程序片段1进行编译,否则对程序片段2进行编译。如果程序片段2为空,则#else没有任何意义,可以省略。

 

第二种形式:

#ifndef 标识符

程序片段1

#else

程序片段2

#endif

与第一种形式的功能恰好相反。

 

3、第三种形式:

#if 标识符

程序片段1

#else

程序片段2

#endif

如果常量表达式的值为真,则对1进行编译,否则对2编译。可以使程序在不同条件下完成不同的功能。

 

 

条件编译用于防止头文件的重复包含

#if !defined (_POINT_H_)

#define _POINT_H_

class point{}。。。

#endif

此例中,条件编译指示#if 被用于检查程序是否定义了标识符_POINT_H_。如果它没有被定义,那么例子中余下的源码就会被处理,否则如果它已经被定义了,那么预处理器就会跳过这段代码。该技术的关键在于程序的第2行,即#define _POINT_H_处。如果程序中的数个源码文件都包含该头文件,那么条件编译将确保改文件的内容仅被包含一次。文件被包含一次将导致条件#define _POINT_H_为真,#if !defined (_POINT_H_)为假,所以当文件被第二次包含时,该类不会被重复定义。对包含类定义的头文件使用条件编译是一个良好的编程习惯。

 

 

posted @ 2011-09-29 14:50  飞逝之痕  Views(293)  Comments(0)    收藏  举报