第10章 高级语言程序设计C-编译预处理_第1页
第10章 高级语言程序设计C-编译预处理_第2页
第10章 高级语言程序设计C-编译预处理_第3页
第10章 高级语言程序设计C-编译预处理_第4页
第10章 高级语言程序设计C-编译预处理_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第十章编译预处理华侨大学计算机科学与技术学院刘韶涛副教授

第十章编译预处理内容提要

C预处理程序#define

#include条件编译指令#undef10.1

C预处理程序按照ANSI标准的定义,C预处理程序应处理如下指令:#if#ifdef

#ifndef

#else#elif

#define#undef

10.1

C预处理程序#line#error#pragma显然,所有的预处理指令都以#开始。而且,每条预处理指令必须独占一行。例如:#include<stdio.h>#include<stdlib.h>是错误的。本章我们只介绍一些最常用的指令,其它指令的使用,请大家需要时参考有关书籍。

10.1

C预处理程序第十章编译预处理内容提要

C预处理程序#define

#include条件编译指令#undef10.2#define#define指令定义一个标记符和一个串,在源程序中发现该标记符时,都用该串替换之。ANSI标准中称这种标记符为宏名字(macroname),称相应的替换为宏替换(macrosubstitution)。这种指令的一般形式为:

#define宏名串这种语句不用分号结尾。宏名字与串之间可以有多个空白符,但串开始后只能以新行符(newline结尾)。比如:#defineTRUE1#defineFALSE0printf(“%d%d%d\n”,FALSE,TRUE,TRUE+1);/*显示012*/

10.2

#define说明:(1)宏定义之后,编译程序将程序中的TRUE和FALSE都替换为1和0。所以显示结果为012。(2)定义一个宏名字之后,可以在其他宏定义中使用它。如:#defineONE1#defineTWOONE+1#defineTHREEONE+TWO

10.2

#define例10-1

宏定义及其使用#defineMESSAGE“Youareright!\n”#defineLONG_STRING“Thisisaverylongstring\thatisusedasaexample\n”#defineABS(a)(a)<0?-(a):(a)voidmain(void){

printf(MESSAGE);/*输出:Youareright!*/

printf(“MESSAGE\n”);/*输出:MESSAGE*/

printf(LONG_STRING);/*输出:Thisisaverylongstring thatisusedasanexample*/

printf(“absof-1and1:%d%d\n”,ABS(-1),ABS(1));}

10.2

#define程序运行情况如下:Youareright!MESSAGEThisisaverylongstringthatisusedasanexampleabsof-1and1:11

10.2

#define说明:(1)遇到标识符MESSAGE时,编译程序用串”Youareright!\n”替换之,等价于printf(“Youareright!\n”);(2)如果标记符用引号(”)括起来,则不发生替换。(3)如果串长于一行,可在行尾用反斜线”\”进行续行。

10.2

#define(4)#define指令还有一个重要功能:宏名字可以有变元。每当遇到宏名字时,与之有关的变元都由程序中的实际变元替换。如上例中的#defineABS(a)(a)<0?-(a):(a)。但要注意,#defineABS(a)(a)<0?-(a):(a)中变元a两边的括号是不能少的,否则,会产生非预期结果。如:#defineABS(a)a<0?-a:aprintf(”absof(10-20):%d\n”,ABS(10-20));ABS(10-20)替换为:10-20<0?-10-20:10-20,则输出结果为-30。

10.2

#define第十章编译预处理内容提要

C预处理程序#define

#include条件编译指令#undef10.3#include程序中的#include指令要求编译程序读入另一个源文件。被读入文件的名字必须由双引号(”)或一对尖括号(<>)包围。如:#include”stdio.h”或#include<stdio.h>都令编译程序读入并编译用于I/O函数处理的包含文件stdio.h。

10.3

#include说明:(1)包含文件中还可以包含其它文件,称为嵌套包含(nestedincludes)。允许的最大嵌套深度随编译程序而变。(2)用尖括号包围头文件时,搜索头文件时按编译程序的预先定义进行,一般只搜索某些专门放置包含头文件的特殊目录。当头文件用双引号包围时,搜索按编译程序实现时的规定进行,一般指搜索当前目录,如未发现头文件,则再按尖括号包围时的办法重新搜索。

10.3

#include第十章编译预处理内容提要

C预处理程序#define

#include条件编译指令#undef10.4条件编译指令若干编译指令允许程序员有选择地编译程序的不同部分,这种过程称为条件编译(conditionalcompilation),广泛用于提供多版本程序的软件生产者。#if、#else、#elif和#endif#if的一般形式为:#if常量表达式代码块

#endif#if后的常量表达式为真时,#if和#endif之间的代码块被编译,否则忽略该代码块。#endif标记#if块的结束。10.4条件编译指令例10-2

编译指令#if的使用#include<stdio.h>#defineMAX100voidmain(void){#ifMAX>90

printf(“Examplefor#if\n”);#endif}程序运行情况如下:Examplefor#if10.4条件编译指令说明:(1)因为常量表达式为真,所以printf()被编译。(2)#if后面的表达式在编译时求值,因此只能包括常数和已经定义的宏名字,不能使用变量。(3)#else指令的作用于C语言条件分支语句中的else类似,建立#if失败时的备选。如上例可以扩充如下:10.4条件编译指令#include<stdio.h>#defineMAX10voidmain(void){#ifMAX>90

printf(“Examplefor#if\n”);#else

printf(“Examplefor#else\n”);/*显示该信息*/#endif}10.4条件编译指令说明:(1)#if后的常量表达式为假,所以#else后的代码块被编译。(2)#else既标记#if块的结束,也标记#else块的开始,每个#if只能与一个#endif匹配。#elif指令的一般形式为:

#if表达式代码块

#elif

表达式1

代码块1#elif

表达式2

代码块2…#elif

表达式N

代码块N#endif10.4条件编译指令(3)#elif指令的含义是“否则,如果”,它为多重选择建立一条if-else-if链。如果#if表达式为真,该代码块被编译,此时就不再测试其它#elif表达式,否则,序列中的下一块被测试,如成功则编译之。如:#defineUS0#defineENGLAND1#defiineRRANCE2#defineACTIVE_COUNTRYUS#ifACTIVE_COUNTRY==UScharcurrency[]=”dollar”;/*被编译*/#elifACTIVE_COUNTRY==ENGLANDcharcurrency[]=”pound”;#elsecharcurrency[]=”franc”;#endif10.4条件编译指令(4)#if和#elif也可以嵌套,最大嵌套深度随编译程序而变。与C语言中条件分支语句if-else嵌套中的else与if的对应关系类似,要注意嵌套链中#if与#endif、#if与#else、#if与#elif的对应关系。10.4条件编译指令#ifdef和#ifndef条件编译的另一个方法是使用编译指令#ifdef和#ifndef,分别表示“如果已定义”和“如果未定义”。#ifdef的一般形式为:

#ifdef

宏名字

代码块

#endif其含义为:如果前面已经在一个#define指令中定义了宏名字,则编译代码块。类似地,#dendef的一般形式为:10.4条件编译指令

#ifndef

宏名字

代码块

#endif其含义为:如宏名字还未被一个#define指令定义,则编译其中的代码块。注意:#ifdef和#ifndef都可以使用#else,但不能用#elif。10.4条件编译指令例10-3

编译指令#ifdef和#ifndef的使用#include”stdio.h”#defineTED10voidmain(void){#ifdefTED/*已定义宏TED*/

printf(“HiTed\n”);/*被编译*/#else

printf(“Hianyone\n”);#endif#ifndefRALPH/*未曾定义宏RALPH*/

printf(“RALPHnotdefined\n”);/*被编译*/#endif}10.4条件编译指令程序运行情况如下:HiTedRALPHnotdefined说明:(1)因为已经在#define编译命令中定义了宏TED,所以语句printf(“HiTed\n”);被编译,因为未曾在#define中定义宏RALPH,所以语句printf(“RALPHnotdefined\n”);*被编译。(2)#ifdef和#ifndef的嵌套情况与#if相同。10.4条件编译指令第十章编译预处理内容提要

C预处理程序#define

#include条件编译指令#undef10.5#undef#undef指令的一般形式为:

#undef

宏名字其作用是删除前面定义的宏名字,主要用于使宏名字局部化,使其仅局部于需要这类宏名字的代码段。10.5#undef例10-4

编译指令#undef的使用#include"stdio.h"#defineNAME"TsinghuaUni.\n"/*定义了宏NAME*/voidmain(void){#ifdefNAME

printf(NAME);/*参加编译*/#endif#undefNAME/*取消了宏NAME的定义*/#ifndefNAME/*没有定义宏NA

温馨提示

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

评论

0/150

提交评论