相对于C语言,C++确实改进了不少,由于C++兼容C语言的好多东西,所以在程序分析的时候不免遇到一些C语言的问题。
说起预处理功能,它是由一些处理命令组成的,由于这些命令在程序正常编译之前执行,因此得名。C++常用的预处理命令有三种:
1宏定义命令
这种命令一般用在C语言中,C++中已经很少使用,宏定义命令分为简单宏定义命令和带参数宏定义命令。
简单宏定义命令用来讲一个标识符(宏名)定义为一个字符串(替换文本)。宏定义命令被执行时,将程序中出现的宏名用被定义的字符串替换,称为宏替换,替换后再进行编译。
举个例子:已知半径,编程求圆的周长,面积和球的体积
<span style="font-size:18px;">#include <iostream.h> #define PI 3.14159 void main() { double r,l,s,v; cout<<"Input radius: "; cin>>r; l=2*PI*r; s=PI*r*r; v=4.0/3.0*PI*r*r*r; cout<<"l="<<l<<endl<<"s="<<s<<endl<<"v="<<v<<endl; }</span>
该程序中所有的PI都被宏定义的字符串替换掉。这种简单的替换一般在C语言中使用,用来定义符号常量,而在C++中使用常类型符const来定义常量,congst不仅可以定义具有类型的常量,也可以定义不同存储类的常量,这就是C++语言的方便之处。因此上述的程序可以改为:
<span style="font-size:18px;">#include <iostream.h> const double PI=3.14159;//定义的常量为double型 void main() { double r,l,s,v; cout<<"Input radius: "; cin>>r; l=2*PI*r; s=PI*r*r; v=4.0/3.0*PI*r*r*r; cout<<"l="<<l<<endl<<"s="<<s<<endl<<"v="<<v<<endl; } </span>
<span style="font-size:18px;"> </span><span style="font-size:18px;">带参数的宏定义命令是指在宏名后面跟着参数表,在替换时,仅替换宏体中与参数表相同的标识符。带参数的宏定义中出现的参数称为形参,程序中出现用宏定义时出现的参数称为实参。看一个例子:</span>
<span style="font-size:18px;">#include <iostream.h> #define ADD(x,y) (x)*(y)//替换文本 void main() { int a=1,b=4; int s=ADD(a+2,b-3); cout<<"s="<<s<<endl; } </span>
<span style="font-size:18px;">#include <iostream.h> #define ADD(x,y) x*y void main() { int a=1,b=4; int s=ADD(a+2,b-3); cout<<"s="<<s<<endl; } </span>
注意这两个程序的不同之处,为避免发生的问题,在C++中已经很少出现这种带参数的宏定义命令,取而代之的内联函数,体现C++的优越性。又因为带参数的宏定义对于形参没有类型要求,这是C语言的弊端。
2文件包含命令
文件包含命令用来将一个已有的文件的全部内容插入到程序的某个位置,以备使用。C++中常用的有#include <iostream.h>(文件提供有关输入输出的功能)和#include <math.h>(文件提供许多数学计算的函数),文件包含命令一般放在程序的开头。
文件包含命令格式:#include <文件名>(系统)和 #include "文件名"(自定义)
来一个例子说明这类命令:求两个整型数的点间距离:
<span style="font-size:18px;">#include <iostream.h> #include <math.h> void main() { double distance(int,int,int,int); int x1=1,y1=2,x2=3,y2=4; cout<<"两个int型数的点间距离: "; double juli=distance(x1,y1,x2,y2); cout<<juli<<endl; } double distance(int a1,int b1,int a2,int b2) { double s=sqrt((a1-a2)*(a1-a2)*(b1-b2)*(b1-b2));//数学中的根号函数 return s; } </span>
3条件编译命令
该命令用来定义某些编译内容要在满足一定条件下才参与编译。
格式1:当标识符被宏定义时,程序段1参与编译,否程序段2参与编译。
#ifdef <标识符>
<程序段1>
#else
<程序段2>
#endif
格式2:当标识符未被宏定义时,程序段1参与编译,否则程序段2参与编译。
#ifndef <标识符>
<程序段1>
#else
<程序段2>
#endif
格式3:当常量表达式的值非0时,程序段1参与编译,否则程序段2参与编译。
#if <常量表达式>
<程序段1>
#else
<程序段2>
#endif
还是来写一个程序说明这类命令:
#include <iostream.h>
#include "abc"
void main()
{
cout<<"hello!"<<s<<endl;
}
而文件abc.h的内容为:
#include "abc.h"
#if T=1
char s[]="good morning! ";
#endif
程序的结果为;hello!good morning!