C++中的预编译处理方式
预处理程序又称预处理器,它包含在编译器中。预处理程序首先读源文件。预处理的输出是“翻译单元”,它是存放在内存中的临时文件。编译器接受预处理的输出,并将源代码转换成包含机器语言指令的目标文件。
预处理程序对源文件进行第一次处理,它处理的是预处理命令。C++提供的预处理命令主要有3种:文件包含命令(头文件),宏定义命令,条件编译命令。
1.文件包含命令(头文件)
所谓“文件包含”是指将另一个源程序的内容合并到源程序中。C++程序提供了#include命令用于实现文件包含的操作它有下列两种格式:
●#include <文件名>
●#include “文件名”
文件名一般以“.h”为扩展名,因而称它为“头文件”。
第一种形式使用“<>”将文件名括起来。这些头文件一般存在于C++系统目录中的include子目录。C++预处理程序遇到这条命令后,就到include子目录中搜索给出的文件,并把它嵌入到当前文件中。这种形式也是标准形式。
第二种形式使用双引号将文件名括起来。预处理程序遇到这种格式的包含命令后,首先在当前文件所在目录中搜索,如果找不到,再按标准方式进行搜索。这种方式适合用于用户编写的头文件。
#include文件可以嵌套,即在一个被包含的文件中可以包含另一个文件。
2.宏定义命令
#define用来进行宏定义。宏定义有两种形式:不带参数的宏和带参宏。
在C语言中,#define用来建立常量,或者定义带参数的宏。在C++中仍然保留
3.条件编译
一般情况下,源程序中所有的语句都参加编译,但可以对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。条件编译可使同一源程序在不同的编译条件下得到不同的目标代码。
C++提供的条件编译命令有以下3种形式。
①第1种格式如下。
#ifdef 标识符
程序段 1
[#else
程序段 2]
#endif
该形式命令的作用是当指定的标识符已经被#define定义过,则在编译段1,否则程序段1,否则程序段2。也可以用#else部分。
例如,在调试程序时,有时希望输出一些信息,而在调试完成之后不再需要。可以在源程序中插入以下条件编译。
#ifdef DEBUG
cout<<“ x=”<
#endi
如果在该条件编译之前有命令行“#define DEBUG”,则在程序运行时会输出x、y、z的值,以便调试时使用和分析。调试完成后只需将这个#define命令行删除即可。
②第二种格式如下
#ifndef 标识符
程序段 1
[#else
程序段 2]
#endi
如果标识符没有被#define命令定义过,则编译程序段1,否则就编译程序段2.还有就是我们在后面建立工程时将用到的条件编译。
在工程的地方条件指示符#ifndef的最主要是目的是防止头文件中添加头文件,所以就有可能出现头文件重复被编译的情况,这时程序就会报错,因此就要用到条件编译。形式如下:
#ifndef _头文件名_H
#define _头文件名_H
…
#endi
这样一个工程文件里同时包含两个同样的同文件时,就不会出现重定义的错误了。
#include
usingnamespace std;
intmain(intargc,char *argv)
{
#ifdef PI
cout<<"PI = "<<PI<<endl;
#else
#define PI 4
#endif
cout<<"PI = "<<PI<<endl;
#undef PI// 撤销PI的宏定义
retrun0;
}
③第三种格式如下:
#if 表达式 1
程序段 1
[#elif 表达式2
程序段 2]
#endif
该形式的命令的作用是当指定的表达式(必须是整型常量表达式)值为真(非零)时编译程序段1,否则编译程序段2。也可以没有#else部分。
④第四种格式如下。
#if 表达式1
程序段 1
#elif 表达式2
程序段 2
#elif 表达式3
程序段 3
…
[#else
程序段n+1]
#endif
其中“elif”的含义是“else if”。该命令的作用是如果表达式1值为真,则编译程序段1;否则,如果表达式2值为真,则编译程序段2;如果所有表达式值都为假,则编译程序段n+1。也可以没有#else部分。