《计算机基础与C语言程序设计》课件第8章_第1页
《计算机基础与C语言程序设计》课件第8章_第2页
《计算机基础与C语言程序设计》课件第8章_第3页
《计算机基础与C语言程序设计》课件第8章_第4页
《计算机基础与C语言程序设计》课件第8章_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第8章编译预处理8.1文件包含8.2宏定义8.3条件编译编译预处理是C语言编译程序对C语言源程序进行编译前,对预处理命令进行预先处理的过程。编译预处理由编译预处理程序完成。

C语言中的编译预处理命令有:#define、#include、#undef、#error等。以#include、#define等开头的程序行称为编译预处理命令行,必须以“#”开始,行尾不得加“;”,以区别于C语句。这些命令行的语法与C语言中其它部分语法无关。它们可以根据需要出现在程序的任何一行的开始部位,其作用一直持续到原文件的末尾,除非重新设置。

C语言中常用的编译预处理命令有:文件包含命令、宏定义命令和条件编译命令。

在C语言中,扩展名为“.h”的文件被称为头文件。它们包含了大量的符号常量定义、函数说明等。编写程序时若需要使用这些文件,就要用文件包含命令将这些文件包含到源程序中。

文件包含命令是以“#include”开始的预处理命令,其主要功能就是将指定的文件内容嵌入到文件包含命令所在的地方,取代该命令,从而把指定文件和当前的源程序文件组合在一起。8.1文件包含

#include的一般语法格式为

#inclucde<文件名>

#include"文件名"

两种形式的区别是:使用尖括号时,编译预处理程序只在系统指定的文件夹中寻找文件;而使用双引号时,编译预处理程序首先在当前文件所在的文件夹中寻找文件,如果找不到则在系统指定的文件夹中再寻找文件。

图8-1文件包含命令的的作用一个大的程序由很多模块组成,一般由多个程序员共同编写。可以把公用信息组成一个文件,其它文件使用时,就可以用文件包含命令将其嵌入,这样可以节省编程时间,提高编程效率。

说明:

(1)一般情况下文件包含命令放在源程序的开头。

(2)一条文件包含命令只能包含一个文件,如果需要包含多个文件就需要多条文件包含命令。

(3)文件包含命令可以嵌套,即被包含文件中还可以包含其它文件。

(4)文件包含命令中的文件名必须包括主文件名及其扩展名。

(5)当被包含文件修改后,对包含该文件的源文件必须重新进行编译、连接。

C语言源程序中允许用一个标识符来表示一个字符串,称为“宏定义”,其中,标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替换,称为“宏替换”或“宏展开”。8.2宏定义8.2.1不带参数的宏定义

不带参数的宏定义的一般语法格式为

#define宏名替换文本

它的作用是:在其后的源程序中,凡是遇到宏名的地方,编译预处理程序都将其替换为宏定义中的替换文本。

例如:

#definePI3.1415926

#defineforeverfor(;;)

以上的宏定义在宏替换时,凡是源程序中出现的PI(字符串中的除外),编译预处理程序都将其替换为3.1415926;凡是源程序中出现的forever(字符串中的除外),编译预处理程序都将其替换为for(;;)。说明:

(1)宏名一般用大写标识符表示,但这不是规定,只是人们的习惯。

(2)宏定义只是一个宏名与替换文本之间的简单替换。它与定义变量不同,不为宏名分配内存空间,只做替换,且替换时并不做正确性检查。

(3)宏定义不是C语句,所以行尾不需要“;”。如果行尾有“;”,连同分号都将替换到宏名中去。

(4)一个很长的宏定义可以在每一个要被连续的行后面加上反斜杠“\”连续下去。

(5)宏替换只作用于标识符,而不作用于字符串,即双引号内与宏名相同的字符串不

替换。

(6)宏定义中可以使用已经定义的宏名,即后面的宏定义可以使用前面宏定义的宏名。

(7)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要中途终止其作用域,可使用#undef命令(也必须写在函数之外)。

【例8.1】编写程序,输入半径,计算并输出圆的周长和面积。

#definePI3.1415926

#include<stdio.h>

main()

{

floatr,l,s;

printf("Inputr:");

scanf("%f",&r);

l=2*PI*r;

s=PI*r*r;

printf("r=%f,l=%f,s=%f\n",r,l,s);

}

程序运行结果:

Inputr:3↙

r=3.000000,l=18.849556,s=28.274334

【例8.2】编写程序,对格式输出函数、整型输出格式、实数输出格式进行宏定义并在程序中应用。

#definePRprintf

#defineD"%d"

#defineF"%f"

#include<stdio.h>

main()

{

inti=1,j=2;

floata=3.45,b=6.789;

PR(D","D"\n",i,j);

PR(F","F"\n",a,b);

}

程序运行结果:

1,2

3.450000,6.7890008.2.2带参数的宏定义

带参数的宏定义的一般语法格式为

#define宏名(形参表)替换文本

它的作用是:在其后的源程序中,凡是遇到带实参的宏名,编译预处理程序都将其替换为宏定义中的替换文本,在替换时,特别要将替换文本中的形参替换为程序中的实参。

例如:

#definesum(a,b)a+b

其中sum是宏名,a、b是形参。当程序中出现sum(x,y)这样的宏名时,编译预处理程序将把其替换为x+y。说明:

(1)带参数的宏定义仍然是一个宏名与替换文本之间的简单替换,只是在替换时要将替换文本中的形参替换为程序中的实参,且替换时还是不作正确性检查。

(2)对于带参数的宏定义,宏名与参数表之间不能有空格,否则就变成不带参数的宏

定义。

(3)带参数的宏定义中的形参是标识符,而在宏替换时的实参可以是任意的表达式。

(4)对于带参数的宏定义,在定义时最好将形参和整个替换文本用括号分别括起来,这样在宏替换后可以避免与原宏定义意义不符的错误。

【例8.3】编写程序,用带参数的宏定义实现输出三个整数中的最大值。

#defineMAX(x,y)((x)>(y)?(x):(y))

#include"stdio.h"

main()

{

inta,b,c,max;

printf("Inputa,b,c:");

scanf("%d%d%d",&a,&b,&c);

max=MAX(a,b);

max=MAX(max,c);

printf("MAX=%d\n",max);

}

程序运行结果:

Inputa,b,c:123↙

MAX=3

一般情况下,C语言源程序中的所有代码都要进行编译。条件编译是指源程序中的某些代码只有在满足特定条件时才进行编译,否则不进行编译。条件编译由条件编译命令完成。条件编译命令分为两类:一类是#if,另一类是#ifdef和#ifndef。8.3条件编译8.3.1#if

1.形式1

#if常量表达式

程序段1

#else

程序段2

#endif

它的作用是:当常量表达式的值为非0时,则对程序段1进行编译,否则;对程序段2进行编译。

2.形式2

#if常量表达式

程序段

#endif

它的作用是:当常量表达式的值为非0时,则对程序段进行编译;否则,不对程序段进行编译。

3.形式3

#if常量表达式1

程序段1

#elif常量表达式2

程序段2

#elif常量表达式n

程序段n

[#else…程序段n+1]

#endif

它的作用是:按常量表达式顺序进行计算,第一个为非0的常量表达式i将引起对程序段i的编译,并且不再计算后面的表达式。如果所有常量表达式的值都为0,则对程序段n+1进行编译。8.3.2#ifdef和#ifndef

1. #ifdef

形式1

#ifdef宏名

程序段1

#else

程序段2

#endif

它的作用是:如果宏名在此之前已经由#define给出定义,则对程序段1进行编译,否则,对程序段2进行编译。形式2

#ifdef宏名

程序段

#endif

它的作用是:如果宏名在此之前已经由#define给出定义,则对程序段进行编译,否则,对程序段不进行编译。

2.#ifndef

形式1

温馨提示

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

评论

0/150

提交评论