联系方式:北京源智天下科技有限公司第六讲:编译预处理杨章伟e-mail:jtclass@163.com1-2北京源智天下科技有限公司联系方式:课程内容安排•预处理命令•宏•文件包含•条件编译•其他命令•综合练习•思考和习题1-3北京源智天下科技有限公司联系方式:预处理命令•预处理就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。为让用户更好使用预处理,C++提供了丰富的预处理命令,主要包括如下几种:#define、/#error、#if、#else、#elif、#endif、#ifdef、#ifndef、#undef、#line和#pragma。•由上述命令读者可以看出,每个预处理指令均带有符号“#”。简单来说,上面的这些预处理命令可以划分为文件包含,条件编译、布局控制和宏替换4个大类。1-4北京源智天下科技有限公司联系方式:宏•在C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏代换或宏展开。•总的来说,宏定义可以分为:•不带参数的宏定义•带参数的宏定义1-5北京源智天下科技有限公司联系方式:带参数的宏定义该范例定义了一个带有参数的宏,并在主程序中调用该宏,读者可仔细理解该程序,掌握带参数的宏的使用1-6北京源智天下科技有限公司联系方式:代码清单•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}1-7北京源智天下科技有限公司联系方式:文件包含•文件包含是C++预处理程序的另一个重要功能。文件包含是指一个C++源程序中将另一个C++源程序包含进来,通过#include预处理指令实现。•#include被称为文件包含命令,其意义是把尖括号或引号“”内指定的文件包含到本程序来,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h。因此也称为头文件或首部文件。•文件包含的作用是在系统编译之前,将包含文件中的内容拷贝到当前文件的当前位置之后,再进行编译。1-8北京源智天下科技有限公司联系方式:文件包含的实现•该范例定义了两个C++程序file1.cpp和file2.cpp,在file2.cpp中需要用到file1.cpp中的函数,因此需要在file2.cpp中将file1.cpp包含进来。•功能是求两个数之和,其中求和的函数放在file1.cpp文件中,而主函数main()则在file2.cpp文件中。1-9北京源智天下科技有限公司联系方式:示例代码•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}1-10北京源智天下科技有限公司联系方式:条件编译•预处理程序除了提供上面介绍的宏定义和文件包含功能,其还提供了条件编译的功能。条件编译可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。C++中的条件编译有三种形式:•#ifdef形式:是指该形式的第一个编译命令为#ifdef。•#ifndef形式:是指该形式的第一个编译命令为#ifndef。•#if形式:是指该形式的第一个编译命令为#if1-11北京源智天下科技有限公司联系方式:其他命令•前面内容介绍了预处理程序的许多命令,如宏定义、包含文件和条件编译等。除此之外,预处理程序还支持其他一些命令:•#error命令•#line命令•#pragma1-12北京源智天下科技有限公司联系方式:综合练习•该范例定义了两个宏,在主函数main()中使用了条件编译语句来控制程序的运行,读者可仔细理解其输出结果。1-13北京源智天下科技有限公司联系方式:(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}1-14北京源智天下科技有限公司联系方式:执行流程图开始#defineCIR(r)r*r#defineTESTz=CIR(x+y)是#ifdefTEST否结束coutx\tyendl;否coutz=zendl1-15北京源智天下科技有限公司联系方式:思考和习题•C++中为什么要提供预处理功能?其作用是什么?•C++的预处理主要指其提供的哪4个方面的实现?•带参数的宏定义和调用与不带参数的宏定义和调用有何区别?•文件包含命令后的和“”有什么区别?•定义一个不带参数的宏PI,使其完成求给定半径的圆的周长和面积