程序设计教程:用C++语言编程 第4版 课件 11 编译预处理_第1页
程序设计教程:用C++语言编程 第4版 课件 11 编译预处理_第2页
程序设计教程:用C++语言编程 第4版 课件 11 编译预处理_第3页
程序设计教程:用C++语言编程 第4版 课件 11 编译预处理_第4页
程序设计教程:用C++语言编程 第4版 课件 11 编译预处理_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译预处理主要内容编译预处理概述文件包含命令(#include)宏定义(#define)命令条件编译命令编译预处理命令C++程序中可以写一些供编译程序使用的命令:编译预处理命令。编译预处理命令不是C++程序所要完成的功能,而是用于对编译过程给出指导,其功能由编译预处理系统在编译时候来完成。编译预处理命令主要有:文件包含命令(#include)宏定义(#define)命令条件编译命令文件包含命令#include文件包含命令是一种编译预处理命令,其格式为:#include<文件名>

或#include"文件名"include命令的含义是:在编译前,用文件名所指定的文件内容替换该命令。<文件名>表示在系统指定的目录下寻找指定文件。"文件名"表示先在包含#include命令的源文件所在的目录下查找指定文件,然后再在系统指定的目录下寻找指定文件。文件包含命令为程序的多模块结构提供了支持。//file1.hexternintx;//全局变量x的声明intf();//全局函数f的声明//file1.cppintx=1;//全局变量x的定义intf()//全局函数f的定义{ ......}//file2.hvoidg();//全局函数g的声明//file2.cppvoidg()//全局函数g的定义{ ......}//main.cpp#include"file1.h"//把文件file1.h中的内容包含进来#include"file2.h"//把文件file2.h中的内容包含进来intmain()//全局函数main的定义{ doubler;//局部变量r的定义

...... r=x*f();//x、f在file1.cpp中定义

...... g();//g在file2.cpp中定义

......}宏定义在C++中,宏定义是一种编译预处理命令,用它可以定义常量和实现类似函数的功能(带参数的宏):#define凵<宏名>(<参数表>)凵<文字串>例如:#define

max(a,b)

(((a)>(b))?(a):(b))在编译之前,编译预处理程序将对宏的使用进行文字替换!然后交给编译程序编译。例如:编译前将把cout<<max(x,y);替换成:cout<<(((x)>(y))?(x):(y));与函数相比,宏的效率高。宏定义的不足之处需要加上很多的括号,否则会出问题:#definemax(a,b)a>b?a:b10+max(x,y)+z将被替换成:10+x>y?x:y+z有时会出现重复计算:#define

max(a,b)

(((a)>(b))?(a):(b))max(x+1,y*2)将被替换成:(((x+1)>(y*2))?(x+1):(y*2))//

x+1或y*2要计算2次替换时不进行参数类型检查和转换。

不利于一些工具(如调试)对程序的处理。宏定义也可以只给出名而不给出值,此时仅表示告诉编译预处理程序某个宏名被定义了,例如:#defineABC这种形式的宏定义将在条件编译预处理中使用。条件编译编译程序根据不同的情况来选择需编译的程序代码。例如,编译程序将根据宏名ABC是否被定义,来选择需要编译的代码(<代码2>或<代码3>):<代码1>//必须编译的代码#ifdefABC <代码2>//如果宏名ABC有定义,编译之#else <代码3>//如果宏名ABC没有定义,编译之#endif<代码4>//必须编译的代码用于条件编译的宏名ABC在哪里定义?在程序中定义宏 <代码1>//必须编译的代码#defineABC#ifdefABC <代码2>//如果宏名ABC有定义,编译之#else <代码3>//如果宏名ABC没有定义,编译之#endif<代码4>//必须编译的代码缺点:要修改程序来选择需要编译的代码!在编译环境中定义宏:命令行cl<源文件1><源文件2>...-DABC...VisualC++6.0的集成开发环境中,选择“Project|Settings”菜单,在“ProjectSettings”对话框的“C/C++”选项卡中,选择“Category”中的“Preprocessor”,然后在“Preprocessordefinitions”中添加要定义的宏名:ABC。条件编译命令的常用格式#ifdef/#ifndef<宏名> <程序段1>[#else <程序段2>]#endif上述条件编译命令的含义是:如果<宏名>有定义(#ifdef)或无定义(#ifndef),则编译<程序段1>,否则编译<程序段2>,其中,#else分支可以省略。条件编译命令的另一种格式#if<常量表达式1>/#ifdef<宏名>/#ifndef<宏名> <程序段1>#elif<常量表达式2> <程序段2>......#elif<常量表达式n> <程序段n>[#else <程序段n+1>]#endif如果<常量表达式1>的值为非零(#if)或<宏名>有定义(#ifdef)或<宏名>无定义(#ifndef),则编译<程序段1>,否则,如果<常量表达式2>为非零值,则编译<程序段2>,...,否则如果有#else,则编译<程序段n+1>,否则什么都不编译。<常量表达式>中只能包含字面常量或用#define定义的常量。条件编译的作用条件编译的作用:避免包含头文件带来的重复定义或声明基于多环境的程序编制......避免头文件中重复定义或声明重复包含下面的头文件不会引起多次编译://module1.h#ifndefMODULE1#defineMODULE1......//module1中的程序实体的声明或定义#endif基于多环境的程序编制编译到不同的平台#ifdefUNIX ......//适合于UNIX环境的代码#elifWINDOWS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论