C语言9编译预处理_第1页
C语言9编译预处理_第2页
C语言9编译预处理_第3页
C语言9编译预处理_第4页
C语言9编译预处理_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

9第九章编译预处理

5/13/20241◆宏定义

◆文件包含◆条件编译

【编译】C编译系统对源程序进行:词法和语法分析,代码生成,优化→

.OBJ文件【编译预处理】编译前对源程序进行一些预加工(改善程序设计环境/模块化设计)编译预处理命令均以#开头,未尾不加分号可出现在程序的任何位置,其作用范围:出现点至所在源程序未尾。编译预处理5/13/20242重庆工学院计算机科学与工程学院基础系

预处理功能

C语言的预处理程序负责分析和处理以“#”为首字符的预处理控制行。预处理是在编译前进行的。预处理控制行主要有:宏替换、文件包含、条件编译和行控制等。宏替换

define预处理命令不仅可以定义符号常量及字符串,而且也可以定义带参数的宏。1.简单的字符串替换一般形式

#define宏标识符字符串通常“宏标识符”用大写字母表示,用空格分开,末尾不带“;”,以换行符结束。5/13/20243重庆工学院计算机科学与工程学院基础系例如:#defineN10#defineTRUE-1#defineFALSE0#defineON1#defineOFF0#defineYES1#defineNO0#definePI3.14159#defineE2.7183#defineBLACK0#defineBLUE1#defineBEGIN{#defineEND}5/13/20244重庆工学院计算机科学与工程学院基础系

使用宏替换可增加程序的可移植型。例如:在程序中定义显示工作摸式为640*350,#defineXMAX639#defineYMAM349当改为1024*1024时,可定义如下:#defineXMAX1023#defineYMAX1023这就增加了图形程序对硬件环境的适应性。2.带参宏定义及宏调用

与函数可带形式参数一样,宏标识符也可带有参数。在程序中可用实参数替带形式参数,实现宏调用。5/13/20245重庆工学院计算机科学与工程学院基础系宏定义的一般格式:

#define宏标识符(形参数表)表达式宏调用的一般形式:

宏标识符(实参数表)例如:#defineMAX(a,b)(a>b)?a:bmain(){

intx,y;x=10;y=20;

printf(”Themaximumdatais:%d”,MAX(x,y));}替换过程:

printf(”Themaximumdatais:%d”,(x>y)?x:y);5/13/20246重庆工学院计算机科学与工程学院基础系1、宏定义格式

#define宏名宏体宏名和宏体均为字符串,前者必须符合标识符命名规则。预处理时在程序中用宏体替换宏名。注意:可以用

#undef

宏名

终止该宏名的作用范围。宏定义的撤消:#undef

宏标识符5/13/20247重庆工学院计算机科学与工程学院基础系①定义符号常量【例一】#defineM3#defineN(M+1)#defineNNN*N/2main(){

clrscr();

printf("NN=%d,",NN);printf("5*NN=%d\n",5*NN);}结果:NN=8,5*NN=40【讨论】

如果第二行改为:

#defineNM+1

结果:

NN=6,5*NN=185/13/20248重庆工学院计算机科学与工程学院基础系②带参数的宏定义

格式

#define宏名(参数表)宏体【例二】#definePI3.14159#defines(r)PI*r*rmain(){floata=1,sum;sum=s(a);

printf("r=%.0f,s=%f\n",a,sum);}结果:r=1,s=3.1415905/13/20249重庆工学院计算机科学与工程学院基础系②带参数的宏定义

【例三】#definePT5.5#defines(A)PT*A*Amain(){

inta=1,b=2;printf("%4.1f\n",s(a+b));}结果:9.5【讨论】注意s(a+b)不是函数,它不做任何计算(如果是函数,则s(a+b)为s(3),结果49.5)

s(a+b)=5.5×1+2×1+2=9.5

5/13/202410重庆工学院计算机科学与工程学院基础系②带参数的宏定义【例四】选择正确答案#include"stdio.h"#defineSUM(y)1+ymain(){

intx=2;printf("%d\n",SUM(5)*x);}

A)10B)11C)12D)15结果:B5/13/202411重庆工学院计算机科学与工程学院基础系2、文件包含#include<>标准方式只按标准方式(系统存放C库函数头文件所在目录)查找所要包含的文件

对TC,默认只在\tc\include目录下查找#include““

先在源文件所在目录找指定头文件,若无再按标准方式找(更保险)功能:把给定的包含文件的内容嵌入到一个源程序文件中。

#include”文件名“或:#include<文件名>5/13/202412重庆工学院计算机科学与工程学院基础系#include”font.h”

A

font.h

B

A

B

file1.c

file1.c

包含文件示意图

特别警示 文件包含不可以彼此互相包含,否则容易造成嵌套定义函数,这是C语言不允许的。

5/13/202413重庆工学院计算机科学与工程学院基础系

包含文件的存放地点,由文件路径和文件名指定,并放入双引号或尖括号中。

系统约定的查找顺序是:双引号:源文件所在的当前文件目录系统指定的标准目录尖括号:直接查找指定的标准目录

Forexample:用户在当前目录中定义有“font.h”文件,在编译程序的系统标准目录中也定义有一个同名“font.h”文件。当用户需要使用自己定义的“font.h”文件时:应使用:#include”font.h”!若使用:#include<font.h>将嵌入系统标准目录中的“font.h”,而不是用户自定义的头文件。5/13/202414重庆工学院计算机科学与工程学院基础系3、条件编译根据条件决定是否编译某一组语句。常用形式:①如果标识符被定义过*

如果标识符未被定义过

#ifdef

标识符#ifndef

标识符程序段1程序段1/*编译此程序段*/#else#else

/*#else部分可省略*/

程序段2程序段2/*反之,编译此程序段*/#endif

#endif

*此处指标识符用#define等命令定义过。5/13/202415重庆工学院计算机科学与工程学院基础系②#if表达式/*如果表达式为真*/

程序段1/*编译程序段1*/#else

程序段2/否则*编译程序段2*/#endif如果用:

if表达式程序段1else

程序段2亦可实现以上功能,但程序段1,2均要编译。如果它们比较大,生成的exe文件就很大。3、条件编译5/13/202416重庆工学院计算机科学与工程学院基础系3、条件编译【例一】#defineDEBUG0main(){

inta=10,b=20,c;

clrscr();c=a/b;#ifdefDEBUG

printf("a=%d,b=%d\n",a,b);#endif

printf("c=%d\n",c);}结果:a=10,b=20c=0【讨论】

如果#defineDEBUG呢?结果不变

如果没有#define行呢?

只输出c=0

5/13/202417重庆工学院计算机科学与工程学院基础系6、以下程序运行结果是

。#defineSQR(x)x*xmain(){

inta=10,k=2,m=1;a/=SQR(k+m);

printf("%d\n",a);}23、条件编译5/13/202418重庆工学院计算机科学与工程学院基础系③

#ifndef

条件编译一般形式:#ifndef

标识符 /*如果表达式为真*/ 程序段1 /*编译程序段1*/#else

程序段2 /否则*编译程序段2*/#endif作用是,如果标识符未被定义,则编译程序段1,否则编译程序段2。例如:3条件编译5/13/202419重庆工学院计算机科学与工程学院基础系

#defineUSA1main(){#ifdefUSA

printf(”currencyisdollar\n”);#else

printf(”currencyispound\n”);#ifndefFRANCE

printf(”franccan’tbeused\n”);#endif}运行结果:currencyisdollarfranccan’tbeused5/13/202420重庆工学院计算机科学与工程学院基础系

1.C语言的预处理功能是由预处理程序实现的。预处理命令行都要以“#”开始,可以出现在源程

温馨提示

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

评论

0/150

提交评论