欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++中的预编译处理方式

程序员文章站 2022-03-19 20:57:32
预处理程序又称预处理器,它包含在编译器中。预处理程序首先读源文件。预处理的输出是“翻译单元”,它是存放在内存中的临时文件。编译器接受预处理的输出,并将源代码...

预处理程序又称预处理器,它包含在编译器中。预处理程序首先读源文件。预处理的输出是“翻译单元”,它是存放在内存中的临时文件。编译器接受预处理的输出,并将源代码转换成包含机器语言指令的目标文件。

预处理程序对源文件进行第一次处理,它处理的是预处理命令。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部分。