1. 首页
  2. 文档大全

第8章 编译预处理教材

上传者:8**** 2022-05-27 11:10:08上传 PPT文件 461KB
第8章 编译预处理教材_第1页 第8章 编译预处理教材_第2页 第8章 编译预处理教材_第3页

《第8章 编译预处理教材》由会员分享,可在线阅读,更多相关《第8章 编译预处理教材(22页珍藏版)》请在文档大全上搜索。

1、第8章 编译预处理 “编译预处理”是C编译系统的一个组成部分. 主要有三种功能:宏定义、文件包含和条件编译。 这些命令都以#开头作标志。 8.1 宏定义8.1.1 不带参数的宏定义 一般形式 : #define 标识符 字符串 注意: 宏名与字符串之间用一个或多个空格分开 例如: # define PI 3.141592654 例8.1 #define PRICE 30main( ) int num,total; num=10; total=num*PRICE; printf(“total=%d”,total);程序运算结果:程序运算结果:total=300说明:(1)宏名的标识符一般用大写字

2、母表示 。(2)使用宏名代替一个字符串,可以用一个简单的名字来代替一个长的字符串 。(3)宏定义用宏名代替一个字符串,只做简单的替换、不做语法检查 。(4)宏定义不能在行末加分号 (5)如果宏名出现在字符串中,不会进行宏展开 说明:(6)如果字符串一行内装不下,可以放到下一行,只要在上一行的结尾处放一个反斜杠() 即可。 例如: # define LONG_STING(7)在进行宏定义时,可以用已定义的宏名,即可以层层置换 例8.2# include # define M 3# define N M+1# define NN N*N/2main()printf(“%dn”,NN);printf

3、(“%dn”,5*NN);第一个第一个printf的输出为的输出为6 第二个第二个printf输出值为输出值为18 说明:# define 命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束. 8.1.2 带参数的宏定义 一般形式 : # define宏名(参数表)字符串 宏名后的括号内有参数表,参数之间用逗号分隔,字符串中包含有括号中所指定的参数。 虚参,实参。如: # define S(a,h) 0.5*a*h area=S(5,2); 对于带参数的宏定义替换步骤:(1)程序中宏名后的实参与命令行中宏名后的虚参按位置一一对应。(2)用实参代替字符串中的虚参,注意只是字符

4、串的代换,不含计算过程。(3)把用实参替换的字符串,替换程序中的宏名。例8.3 写出下列程序运行的结果: # define PT 3.5 # define S(x)PT*x*x main() int a=1,b=2; printf(”%4.1fn”,S (a+b)); 说明: (1)对带参数的宏的展开只是将语句中的宏名内的实参字符串代替# define命令行中的虚参,不能人为的增加括号和计算功能。 (2)由子宏定义时,宏名与其所代替的字符串之间有一个或一个以上的空格。 例8.5 定义一个带参数的宏,使两个参数的值互换,并编一个程序,输入两个整数作为使用宏时的参数,输出已经交换的两个值。# de

5、fine SWAP(a,b) t=b;b=a;a=t;main() int a,b,t; printf(“请输入两个整数:”); scanf(“%d,%d”,&a,&b); printf(“n原来得数据为:a=%d,b=%dn”,a,b); SWAP(a,b); printf(“交换结果为:a=%d,b=&dn”,a,b);8.2 文件包含 “文件包含”处理是指一个源文件可以将另一个源文件的全部内容包含到本文件中。C语言用#include命令来实现“文件包含”的操作。其一般形式为: #include“文件名” 或#include嵌套的情况 如图8.2所示。其中F1的“#include”要求包含

6、文件F2,而F2得“#include”又要求包含F3,因此编译后的程序实际上相当于一个包含F1、F2、F3文件的完整程序。例8.7 头文件应用实例(1)文件print_format.h#define PR printf#define NL “n”#define D “%d”#define D1 D NL#define D2 D D NL #define D3 D D D NL#define D4 D D D D NL#define S “%s”(2)文件file1.c#include”print_format.h”main() int a,b,c,d; char string =“CHINA”

7、; a=1;b=2;c=3,d=4; PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); PR(D4,a,b,c,d); PR(S, string);8.3 条件编译 C语言也允许有选择的对源程序的某一部分进行编译,这就是“条件编译”。 条件编译有以下三种形式: #ifdef 程序段1 #else 程序段2 #endif8.3.1 条件编译语句 1它的功能是:当指定标识符已经被定义过(一般用#define命令定义),则对程序段1进行编译,否则对程序段2进行编译。 8.3.2 条件编译语句 2#ifndef 程序段1 #else 程序段2 #endif它的功能是:若指定的标识

8、符未被定义则编译程序段1,否则编译程序段2。这种形式的功能和第一种形式的功能相反。 例如: # ifndef LIST printf(x%d,y%d,z%dn,x,y,z); # endif 其预处理功能为:如在此之前未对LIST定义,则输出x,y,z 的值。在程序调试时,不对LIST定义,此时输出x,y,z的值,调试结束后,在运行上述程序段之前,加以下面的命令行: # define LIST则不输出x,y,z的值。8.3.3 条件编译语句 3 # if表达式 程序段1 # else 程序段2 # endif 它的功能是:当指定的表达式为真(非零)时.编译程序段1,否则编译程序段2。应用这种条

9、件编译的方法,可以事先给定某一条件:使程序在不同的条件下执行不同的功能。例8.8用条件编译方法实现以下功能: 输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如a变成b,z变成a,其它字符不变)。用# define命令来控制是否要译成密码。例如: # define CHANGE 1 则输出密码。若 # define CHANGE 0 则不译成密码,按原码输出。main() char strMAX; int i; printf(“请输入文本行:n”); scanf(“%s”,str); # if(CHANGE) for(i=0;i=a&striz|stri=a&c=A&c=Z) c=c+32; # endif printf(“%c”,c);


文档来源:https://www.renrendoc.com/paper/212462855.html

文档标签:

下载地址