资源描述:
《编译预处理与c c++程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第22卷第2期甘肃科技Vol.22No.22006年2月GansuScienceandTechnologyFeb.2006编译预处理与C/C++程序设计王才善,邓志杰(光电技术与智能控制教育部重点实验室(兰州交通大学)甘肃兰州730070)摘要:作为C/C++语言提供的一种功能,编译预处理在C/C++编程中具有非常重要而又特殊的地位。在总结了C/C++中编译预处理优缺点后,作者主要讨论了编译预处理在C/C++程序设计中的几个特殊的重要功能。关键词:C/C++程序设计;编译预处理;数据初始化;可移植性中图分类号:TP133译预处理是在编译"预处理"阶段进行的,我们不能1引言在程序
2、调试过程中动态测试编译预处理的功能;再编译预处理在C/C++程序设计的许多方面都者,编译预处理是利用宏后面的字符串对宏标示符有很重要的应用。有效而熟练的使用好编译预处理进行原样替换的,当宏的结构比较复杂时,如若出是一个C/C++程序员必备的基本能力。错,在程序编译过程中不易确定错误的位置并加以排错,从而对程序的调试带来许多不便之处。基于2编译预处理的优缺点上述原因,在C/C++程序中使用编译预处理命令C/C++程序员都知道,编译预处理是C/C+时要非常慎重。+语言提供的一种特殊而又重要的功能。编译预处理命令主要有文件包含(#include)、宏定义(#de23利用编译预处理实现
3、数据初始化fine)和条件编译(#ifdef/#ifndef),在C/C++编在C/C++程序设计中,我们常使用编译预处译系统对程序进行通常的编译之前,先对程序中这理来完成定义常量标示符、实现文件包含等功能。些特殊的命令进行"预处理"。有关编译预处理常用编译预处理命令可以是单行命令,利用它们实现单命令及其格式、功能、实现方式等,在各种C/C++个宏标示符的定义,如前所述的π定义。编译预处程序设计语言书籍中都已作过详细介绍,这儿不再理命令也可以是一段C/C++代码形式的命令,使作讨论。用这些命令可以实现大批量变量的初始化。在编写C/C++程序时使用好编译预处理命令在VisualC
4、++中,MFC就利用了大量的编译可以使得程序代码结构清晰、简短,提高了程序的可预处理命令来实现诸如RTTI、消息映射等功能,这读性、可维护性。例如:若程序中使用常量π=3.些编译预处理命令实际在进行变量初始化(或函数、14159,可以利用宏定义:变量说明)的工作。例如:MFC中宏:#definePI3.14159#defineDECLARE_DYNAMIC(class_name)来实现,而不必在每个出现π的地方都写成常public:量3.14159。这样,如需修改π的值时只需修改宏staticCRuntimeClass定义命令,而不需对每个出现π的地方都修改。class##
5、calse_name;同时,利用好编译预处理便于实现程序在不同virtualCRuntimeClass系统间的移植。许多源代码开放的操作系统为了实3GetRuntimeClass()const;现在不同结构CPU上的系统移植或为了特定应用和宏:而实现功能裁剪时,通过一系列宏和条件编译实现#defineIMPLEMENT_DYNAMIC(class_name,把需要的源代码连接入程序中。base_class_name)当然,编译预处理也有其天生的缺点。由于编_IMPLEMNENT_RUNTIMECLASS(class_name,第2期王才善等:编译预处理与C/C++程序设计b
6、ase_class_name,0xFFFF,NULL)}就实现了类的类型注册和RTTI,这样避免了为每个继承自MFC类库中的类填写一大段代码来实现4利用编译预处理实现软件移植类型注册和RTTI。前面我们在讨论编译预处理的优点时提到过利大批量数据初始化的另一种方法是对需初始化用好编译预处理可以方便实现对软件在不同系统之的变量编写一系列的宏定义来实现。间进行移植。例如:在VC++中提供了集合类数组,有一数一种情况是指对不同字长的计算机,利用宏定组Element_Array如图1:义实现数据类型的定义。例如:#defineUINTunsignedint不同的机器、不同的开发环境,其机
7、器字长、同一类型变量所占存储空间大小可能不一样。当对程图1集合类数组序进行移植时,我们只需要在宏定义中定义标示符,利用定义好的相关类型标示符来定义变量,而不必定义下面一系列编译预处理命令之后,只要在调用逐个修改变量的定义。函数文件中使用一条宏命令:另一种情况是利用宏定义和条件编译实现软件ELEMENT_ARRAY_INITIALIZATION系统的移植和系统功能的裁减。在嵌入式系统开发就可以实现把多个不同类型的多个数据添加进中,首先要将操作系统移植嵌入具体的系统。针对图1的集合类数组Elem