第六讲:编译预处理课程内容安排–预处理命令–宏–文件包含–条件编译–其他命令–综合练习–思考和习题预处理命令–预处理就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。为让用户更好使用预处理,C++提供了丰富的预处理命令,主要包括如下几种:#define、/#error、#if、#else、#elif、#endif、#ifdef、#ifndef、#undef、#line和#pragma。–由上述命令读者可以看出,每个预处理指令均带有符号“#”。简单来说,上面的这些预处理命令可以划分为文件包含,条件编译、布局控制和宏替换4个大类。宏–在C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏代换或宏展开。–总的来说,宏定义可以分为:–不带参数的宏定义–带参数的宏定义带参数的宏定义•该范例定义了一个带有参数的宏,并在主程序中调用该宏,读者可仔细理解该程序,掌握带参数的宏的使用代码清单–1#defineMAX(a,b)(ab)?a:b//定义带参数的宏–2#includeiostream.h–3voidmain()–4{–5intx,y,max;//定义两个整型变量–6coutinputtwonumbers:;–7cinxy;//接收键盘输入–8max=MAX(x,y);//使用宏MAX(a,b)–9coutmax=maxendl;//输出结果–10}文件包含–文件包含是C++预处理程序的另一个重要功能。文件包含是指一个C++源程序中将另一个C++源程序包含进来,通过#include预处理指令实现。–#include被称为文件包含命令,其意义是把尖括号或引号“”内指定的文件包含到本程序来,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h。因此也称为头文件或首部文件。–文件包含的作用是在系统编译之前,将包含文件中的内容拷贝到当前文件的当前位置之后,再进行编译。文件包含的实现–该范例定义了两个C++程序file1.cpp和file2.cpp,在file2.cpp中需要用到file1.cpp中的函数,因此需要在file2.cpp中将file1.cpp包含进来。–功能是求两个数之和,其中求和的函数放在file1.cpp文件中,而主函数main()则在file2.cpp文件中。示例代码–1//file1.cpp–2doubleAdd(doublea,doubleb)//file1文件中包含的函数–3{–4returna+b;//返回两个浮点数之和–5}–6//file2.cpp–7#includefile1.cpp//包含file1.cpp文件–8#includeiostream.h–9voidmain()–10{–11doublea,b;//定义变量–12doublee,f;–13a=3;//初始化变量–14b=2;–15e=Add(a,2);//调用file1.cpp文件中的函数Add–16f=Add(b+1,2);//调用函数–17coute\tfendl;//输出结果–18}条件编译–预处理程序除了提供上面介绍的宏定义和文件包含功能,其还提供了条件编译的功能。条件编译可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。C++中的条件编译有三种形式:–#ifdef形式:是指该形式的第一个编译命令为#ifdef。–#ifndef形式:是指该形式的第一个编译命令为#ifndef。–#if形式:是指该形式的第一个编译命令为#if其他命令–前面内容介绍了预处理程序的许多命令,如宏定义、包含文件和条件编译等。除此之外,预处理程序还支持其他一些命令:–#error命令–#line命令–#pragma综合练习–该范例定义了两个宏,在主函数main()中使用了条件编译语句来控制程序的运行,读者可仔细理解其输出结果。代码清单•1#includeiostream.h•2#defineCIR(r)r*r//带参数的宏定义•3#defineTEST//定义宏•4voidmain()•5{•6intx=1;//定义并初始化变量•7inty=2;•8intz;•9z=CIR(x+y);//调用宏•10coutCIR(x+y)=zendl;//输出宏调用的结果•11#ifdefTEST//条件编译语句•12coutx=x\ty=yendl;//输出结果•13#endif//结束条件编译•14coutz=zendl;//输出结果•15}执行流程图开始#defineCIR(r)r*r#defineTESTz=CIR(x+y)是#ifdefTEST否结束coutx\tyendl;否coutz=zendl思考和习题–C++中为什么要提供预处理功能?其作用是什么?–C++的预处理主要指其提供的哪4个方面的实现?–带参数的宏定义和调用与不带参数的宏定义和调用有何区别?–文件包含命令后的和“”有什么区别?–定义一个不带参数的宏PI,使其完成求给定半径的圆的周长和面积