预处理
概念:在编译之前进行的处理。 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_)为假,所以当文件被第二次包含时,该类不会被重复定义。对包含类定义的头文件使用条件编译是一个良好的编程习惯。

浙公网安备 33010602011771号