版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023/10/7编译预处理C/C++语言程序设计案例教程7.1宏定义7.2文件包含7.3条件编译2023/10/72预处理不是C语言本身的组成部分,不能直接进行编译。在对源程序编译之前,系统先将这部分命令进行“预处理”,处理后源程序将不再包括预处理命令,随后系统完成编译,链接生成目标程序。C语言提供3种预处理功能:宏定义;文件包含;条件编译。2023/10/73案例一宏的使用1.问题描述计算物体在水中的浮力以及在不同液体和不同物体体积下受到的浮力(假设物体全部沉入水中)。2.问题分析浮力=pgv。在水中,物体受到的浮力与体积有关,g是常数,将g定义为宏(无参宏)。在液体中,不同物体在不同液体中受到的浮力与物体体积和液体的密度有关,将计算公式也定义为宏(有参宏)。2023/10/743. C语言代码#include"stdio.h"/*预处理指令是以#号为开头的代码行,#include是一个文件包含预处理*/#defineg9.8/*g定义为无参宏*/#defineF(p,v)(p*9.8*v)/*将浮力计算公式定义为有参宏,物体体积v和液体密度p为参数,也可将F(p,v)定义为(p*g*v),即有参宏的嵌套定义*/voidmain(){floatF1,F2;floatp,v;/*以下部分计算物体在水中的浮力F1*/printf("请输入在水中物体的体积v\n");scanf("%f",&v);F1=1000*g*v;/*替换无参宏名g,将g替换成数值9.8*/printf("物体在水中的浮力是F1=%f\n",F1);/*以下部分计算不同物体在不同液体中的浮力F2*/printf("请输入在某液体中液体的密度p和物体的体积v\n");scanf("%f,%f",&p,&v);F2=F(p,v); /*替换有参宏F(p,v),将F(p,v)替换为表达式p*9.8*v*//*如果采用宏的嵌套定义,F(p,v)首先替换为表达式p*g*v,再替换为p*9.8*v*/printf("物体在液体中的浮力F2=%f\n",F2);#undefg; /*取消g宏定义*/#undefF(p,v); /*取消宏F(p,v)定义*/}2023/10/754.程序运行结果请输入在水中物体的体积v12.2物体在水中的浮力是F1=119560请输入在某液体中液体的密度p和物体的体积v700,24物体在液体中的浮力F2=1646402023/10/767.1宏定义
宏定义是预处理命令中的一种,它提供了一种可以替换源代码中字符串的机制。根据宏中是否有参数,可以将宏定义分为不带参数的宏定义和带参数的宏定义。2023/10/77宏定义是预处理命令中的一种,它提供了一种可以替换源代码中字符串的机制。根据宏中是否有参数,可以将宏定义分为不带参数的宏定义和带参数的宏定义。2023/10/787.1.1不带参数的宏定义
不带参数的宏定义格式如下:#define标识符字符串宏定义格式中“标识符”为用户定义标识符,称为宏名,也叫符号常量,一般用大写字母表示。字符串可以是常量、表达式、格式串等。注意:宏定义不是C语言的语句,宏定义结尾没有分号。2023/10/79说明:(1)预处理中,源程序在宏定义之后出现的所有与宏名一样的标识符都替换成宏定义中的字符串,不做语法检查。例如:将#defineg9.8错误地写成#defineg98,则在编译预处理中将g替换为98进行编译。(2)源程序中宏可以嵌套定义。例如,计算圆柱体体积:#defineR6.3#defineHIGHT12.5#defineVOLUME(3.14*R*R*HIGHT)/*宏的嵌套定义*/在 #defineVOLUME(3.14*R*R*HIGHT)中HIGHT和R宏定义VOLUME在之前,即为宏嵌套定义。2023/10/710嵌套定义的替换过程为由外到内,例如:①将宏名R进行替换,替换结果为#defineVOLUME(3.14*6.3*6.3*HIGHT)②将宏名HIGHT进行替换,替换结果为#defineVILUME(3.14*6.3*6.3*12.5)案例一中:#defineg9.8 /*g定义为无参宏*/#defineF(p,v)(p*g*v) /*g宏定义在F之前,也是宏的嵌套定义*/(3)宏定义的作用域。一个宏名与变量一样也有它的作用域,宏名的作用范围从该宏名的宏定义处开始到所在文件的结尾,或用#undef命令取消该宏定义为止。例如,在如下程序段计算物体在水中的浮力,#include"stdio.h"#defineg9.8 /*宏名g定义开始*/voidmain(){floatF1;floatp,v;...printf("F1=%f\n",F1);undefg; /*undef使得g的宏定义的作用范围到此处为止*/#defineg9.78 /*宏名g重新定义新的精度*/
…}2023/10/7117.1.2带参数的宏定义
带参数的宏定义格式如下:#define宏名(参数表)字符串宏名一般为大写,参数表可以有一个或多个参数组成,参数之间用逗号分隔。例如案例一中,#defineF(p,v)(p*9.8*v),p和v为参数。带参数宏的调用格式如下:宏名(实参表)即将实参替换形参,其他部分不变。例如,假设有#defineSW(x)(x)*(x)如果程序中有语句x=SW(5);,那么编译系统会将SW(5)替换为5*5。但输出语句双引号中的宏定义不做替换。例如:#defineXYZthisisatestprintf("XYZ");输出XYZ,而不是thisisatest。2023/10/712说明:(1)定义时参数和字符串部分要分别用括号括起来,宏名与参数表的括号之间不要加空格,否则就成为不带参数的宏定义语句了。(2)为了保证在宏展开后,字符串中各个参数的计算顺序正确,应当在宏定义中的字符串最外面以及其中的各个参数外面加上圆括号。例如,比较以下两个例子。①#definesqr(x)(x*x)②#definesqr(x)((x)*(x))如果在后续程序中有s=sqr(a+b),程序在预处理时会产生不同的结果:①sqr(x)替换为(a+b*a+b);②sqr(x)替换为(a+b)*(a+b)。(3)在带参宏定义时,也有宏嵌套定义。(4)带参数的宏和函数存在相似之处。例如它们的表示形式都是由一个名字加上几个参数,引用方式也相同,实参和形参的个数都要求相同,但是要注意它们之间的区别。比较以下有参宏和函数的定义:2023/10/713例7.1将一表达式分别定义为宏和函数。#include<stdio.h>#defineSQR(x)((x)*(x))/*宏定义以"#define"开头,不需要对形参进行数据类型声明,不需对宏进行宏类型声明,在宏展开时只是完成替换。*/intSR(intx)/*函数定义没有"#define",有参函数需要对形参进行数据类型声明,函数调用时需要参数传递,要声明函数的类型(int类型除外)。*/{return((x)*(x));}voidmain(){inti;i=1;printf("宏替换如下:\n");do{printf("%d\n",SQR(i++));/*宏替换*/}while(i<=5);i=1;printf("函数运行如下:\n");do{printf("%d\n",SR(i++));/*函数调用*/}while(i<=5);}2023/10/714程序运行结果如下:宏替换如下:1925函数运行如下10/715除以上几点外,有参宏与函数不同还有:(1)代码长度。每次使用时,宏定义代码都被插入程序中,程序的长度将增长。函数定义代码只出现于一个地方;每次使用这个函数时,都被调用那个地方的同一份代码。(2)运算速度。宏替换只占编译时间,不占用运行时间。函数由于在函数调用开始和返回时要进行相应的处理,因此要占用一些运行时间。(3)处理时间不同。宏展开是在编译预处理时进行的。函数调用是在程序运行时处理的,并且要为函数分配内存空间。(4)参数求值。带参数的宏是将形参用实参来代替,即简单的字符替换。宏展开时都将重新求值。函数调用时,要先计算出实参表达式的值,然后将此值传给形参;参数在函数调用时只求值一次。由于有参宏对参数没有数据类型的约定,在某些情况下,使用有参宏定义会更方便:①有如下宏定义:#defineMAX1(a,b)((a>b)?a:b)/*a、b的数据类型可以是整型、浮点型*/②有如下函数定义:MAX2(inta,intb){return((a>b)?a:b);}/*a、b如果是浮点型,需修改形参的数据类型定义*/2023/10/716案例二文件包含的使用1.问题描述根据物体的体积和液体密度,计算物体的浮力(假设物体全部沉入水中)。2.问题分析使用文件包含预处理,将#defineg9.8和#defineF(p,v)(p*g*v)保存在user.h文件,源程序中不再出现宏定义。2023/10/7173. C语言代码#include<stdio.h>#include"user.h"/*使用#include将宏定义所在文件加载到C源程序中*/main(){floatp,v,F2;printf("请输入在某液体中液体的密度p和物体的体积v\n");scanf("%f,%f",&p,&v);F2=F(p,v);printf("物体在液体中的最大浮力F2=%f\n",F2);}4.程序运行结果请输入在某液体中液体的密度p和物体的体积v700,15物体在液体中的最大浮力F2=1029002023/10/7187.2文件包含
文件包含的使用是编写C语言程序中不可缺少的,我们在引用C语言库函数时要使用它;另外,我们也可以将平时积累的一些有用的自定义函数做成一个自定义函数库文件,要使用它们时只需采用文件包含将它们引用过来使用就行,这样就减少了编程的工作量,提高编译效率。文件包含定义格式如下:#include<文件名>或#include"文件名"2023/10/719例如:#include<stdio.h>或#include"stdio.h"。一个文件包含预处理只能包含一个被包含文件。例如,使用文件包含计算一个实数的绝对值和的sin()值,并输出。输入输出函数在stdio.h文件中,绝对值和sin()在math.h文件中,所以除了要在文件包含预处理中有stdio.h,还需要有math.h。#include<stdio.h>/*包含标准输入输出的头文件stdio.h*/#include<math.h>/*包含数学函数的头文件math.h*/main(){...}2023/10/720除包含系统文件外,也可将用户定义的宏保存在用户文件中,在源程序需要宏的时候,将用户文件包含在源文件中。如案例二中,将宏定义g和F定义于user.h文件中。使用文件包含,需注意以下几点:(1)若使用符号< >,系统到存放C库函数头文件所在目录寻找要包含的文件,一般使用库函数使用此符号;若使用符号"",系统在用户程序所在的当前目录寻找要包含的文件,如果找不到再到C库函数头文件所在目录寻找,一般使用用户函数使用此符号。(2)在预处理时,文件包含命令用被包含文件内容替换,成为源文件内容的一部分,与其他源文件代码一起参加编译。例如案例二中使用#include将stdio.h的所有内容,与user.h包含宏定义的文件内容嵌入到该预处理命令处成为源文件的一部分。(3)可以将多个需要包含的内容写到一个头文件中,如案例二;也可以将文件进行嵌套包含。2023/10/721例7.2文件嵌套包含的使用。将 #defineF(p,v)(p*g*v)宏定义保存在user1.h中,#defineg9.8宏定义保存在user2.h中。user1.h文件内容:#include"user2.h"#defineF(p,v)(p*g*v)user2.h文件内容:#defineg9.8/*注意:这里没有文件包含预处理*/使用文件嵌套预处理之后,案例二中的文件预处理程序段如下所示:#include"stdio.h"#include"user1.h"/*使用文件包含,将宏定义的g和F进行预处理*/main(){floatp,v,F2;printf("请输入在某液体中液体的密度p和物体的体积v\n");scanf("%f,%f",&p,&v);F2=F(p,v);printf("theF2is%f\n",F2);}2023/10/722程序运行结果如下:请输入在某液体中液体的密度p和物体的体积v700,24theF2=164640这与案例二中计算在某液体中物体受到的浮力结果相同。2023/10/723案例三#ifdef命令和#ifndef命令的使用1.问题描述编写程序,使程序编译后的程序既能够在16位机上运行的目标代码,也能在32位机上运行的目标代码。2.问题分析16位机与32位机在数据类型上主要是整数存储长度不一样,采用条件编译解决数据位数的问题。2023/10/7243. C语言代码#include<stdio.h>main(){#ifdefPC16/*若PC16被定义为宏,则完成以下预处理*/#defineINTSIZE16/* 16位整型被定义为宏INTSIZE*/#else/*若PC16未被定义为宏,则完成以下预处理*/#defineINTSIZE32/*32位整型数被定义为宏INTSIZE*/#endif/*#ifdef结束*/}2023/10/7257.3条件编译
为了测试程序运行情况,可以通过在程序中添加一些输出语句,根据输出的结果判定程序运行结果是否正确,对错误的程序进行修改直到满足需要。调试结束后将这些输出语句再进行删除。C语言提供了条件编译预处理,能更好的解决测试问题。对程序中的所有源代码有时只需要对其中部分代码进行编译,也就是对部分代码有选择地进行编译,该过程称为条件编译。条件编译主要有#ifdef命令、#ifndef命令还有#if命令。条件编译主要有以下几种形式,#ifdef和#ifnde,以及#if,分别如表7-1~7-3所示2023/10/726表7-1#ifdef条件编译形式条件编译形式说明#ifdef宏名语句
#endif如果宏名被定义过,则执行语句#ifdef宏名语句1#else
语句2#endif宏名如果宏名被定义过,则执行语句1,否则执行语句22023/10/727表7-2#ifndef条件编译形式条件编译形式说明#ifndef宏名语句
#endif如果宏名未被定义过,则执行语句#ifndef宏名语句1#else
语句2#endif如果宏名未被定义过,则执行语句1,否则执行语句22023/10/728表7-3#if条件编译形式条件编译形式说明#if表达式1
程序段1#endif如果表达式1为真,则执行程序段1#if表达式1程序段1#else程序段2#endif如果表达式1为真,则执行程序段1,否则执行程序段2#if表达式1程序段1#elif表达式2程序段2#endif如果表达式1为真,则执行程序段1,否则表达式2为真,执行程序段22023/10/729(1) #if命令中表达式必须是常数表达式,不能包含变量,因为条件编译在编译预处理时进行,而在预处理时不可能知道变量的值。(2) #if和#elif常常与defined命令配合使用,defined命令的格式为defined(宏名)或defined宏名功能:判断某个宏是否已经定义,如果已经定义,defined命令返回1,否则返回0。defined命令只能与#if或#elif配合使用,不能单独使用。例如,#ifdefined(USA)的含义是“如果定义了宏USA”。2023/10/730例7.3#if命令的使用:根据需求计算3个数中最大值或最小值。#include<stdio.h>#defineMAX1voidmain(){inta,b,c,max,min;printf("input3numbers:");scanf("%d%d%d",&a,&b,&c);#ifMAX/*定义的宏为真(或非0)则完成以下程序段;也可写为#ifdefine*/
{max=a; if(b>max)max=b; if(c>max)max=c;printf("themax=%d\n",max);}#else{min=a; if(b<min)min=b; if(c<min)min=c;printf("themin=%d\n",min);}#endif}2023/10/731程序运行结果如下:input3numbers:347421themax=74说明:(1)当程序调试完成后,使编译条件改变为不满足调试条件,原来添加的输出信息就不参与编译,相当于被删除了。(2) #if语句可以减少目标代码的长度,而使用if语句将对整个程序进行编译,所以目标程序会比较长。2023/10/732本章小结本章介绍了宏定义、文件包含和条件编译三种编译预处理。编译预处理是C语言的一大特色,也是C语言与其他高级语言的重要区别之一。编译预处理与源程序编译不同,编译预处理是在编译之前对预处理指令先进行处理。常用的预处理语句主要有宏、文件包含和条件编译。宏定义时用一个标识符来表示一个常量或表达式,在宏调用中将标识符替换成常量或表达式。宏增加编译的时间,但不增加程序运行的时间。文件包含可以将多个源文件连接成一个源文件一起进行编译,并生成一个目标文件。条件编译可根据设定条件来实现对源程序中的某一部分进行编译,合理的使用编译预处理将使得程序更具有移植性和灵活性。使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。2023/10/733预处理命令
学习的意义
C语言的一个重要特征是它的预处理功能。我们知道,一个高级语言源程序在计算机上运行,必须先用编译程序将其翻译为机器语言。编译包括词法分析、语法分析、代码生成、代码优化等步骤,有时在编译之前还要做某些预处理工作,如去掉注释,变换格式等。C语言允许在源程序中包含预处理命令,在正式编译之前(词法分析之前)系统先对这些命令进行“预处理”,然后整个源程序再进行通常的编译处理。从语法上讲,这些预处理命令不是C语言的一部分,但使用它们却扩展了C语言程序设计的环境,可以简化程序开发过程,提高程序的可读性,也更有利于移植和调试C语言程序。本章主要介绍宏定义、文件包括和条件编译等预处理命令。2023/10/734学习的意义
源程序生成执行文件的过程:C语言源程序.c或.cpp编译目标程序.obj链接执行程序.exe#include<stdio.h>#definePI3.14159voidmain(){floatr=4;printf(“s=%f\n”,PI*r*r);}预处理命令预处理本章讨论之重点!2023/10/735必须正确区别预处理命令和C语句、区别预处理和编译,才能正确使用预处理命令。C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。C提供的预处理功能主要有以下三种:1.宏定义2.文件包含3.条件编译分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。语句尾不用分号作结束符,每条语句占一行。2023/10/7367.1宏定义
宏定义分为两种:不带参数的宏定义和带参数的宏定义。
1、不带参数的宏定义
一般形式
#define标识符单词串指令名称宏名,被定义代表后面的单词串
宏体,是宏的内容文本
可缺省,表示宏名定义过或取消宏体
功能
用指定标识符(宏名)代替字符序列(宏体)如
#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);#defineSIZE10#defineINT_STR
"%d"voidmain()
{inta[SIZE],i;for(i=0;i<SIZE;i++)scanf(INT_STR,&a[i]);for(i=SIZE-1;i>=0;i--)printf(INT_STR,a[i]);}宏定义voidmain()
{inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=10-1;i>=0;i--)printf("%d",a[i]);}预编译处理后
注意:宏替换时仅仅是将源程序中与宏名相同的标识符替换成宏的内容文本,并不对宏的内容文本做任何处理。2023/10/737
宏定义注意事项
C程序员通常用大写字母来定义宏名,以便与变量名区别。
如:#definePI3.14159
宏定义的位置任意,但一般放在函数外面。
宏定义时,如果单词串太长,需要写多行,可以在行尾使用反斜线“\”续行符例如:#defineLONG_STRING"thisisaverylongstringthatis\usedasanexample"
宏名的作用域是从#define定义之后直到该宏定义所在文件结束
#undef可终止宏名作用域#undef标识符#defineYES1voidmain(){……..}#undefYES#defineYES0voidmax(){……..}YES原作用域YES新作用域
宏定义可以嵌套定义,但不能递归定义
#defineR2.0#definePI3.14159#defineL2*PI*R(√)#defineSPI*R*R(√)#defineMM+10(×)
程序中字符串常量即双引号中的字符,不作为宏进行宏替换操作
#defineXYZthisisatestprintf("XYZ");输出:XYZ,而不是:thisisatest。2023/10/738
宏定义注意事项
宏定义一般以换行结束,不要用分号结束,以免引起不必要的错误#definePI3.14;
a=PI*2*2;
预编译处理后a=3.14;*2*2;
错误!
宏可以被重复定义。
#defineN10
//第一次宏定义intf(){N的内容是10return(N*N);}#defineN20
//第二次宏定义voidmain(){N的内容是20printf("%d\n",N+f());}
在定义宏时,如果宏是一个表达式,那么一定要将这个表达式用()括起来,否则可能会引起非预期的结果。
#defineNUM110#defineNUM220#defineNUMNUM1+NUM2voidmain()
{inta=2,b=3;a*=NUM;b=b*NUM;printf("a=%d,b=%d\n",a,b);}voidmain()
{inta=2,b=3;a*=10+20;b=b*10+20;printf("a=%d,b=%d\n",a,b);}预编译处理后输出结果:a=60,b=50
()()()输出结果:a=60,b=90
2023/10/7392、带参数的宏定义
一般形式
#define标识符(参数列表)单词串参数表由一个或多个参数构成,参数只有参数名,没有数据类型符,参数之间用逗号隔开,参数名必须是合法的标识符通常会引用宏的参数
例:
#defineS(a,b)a*b………..area=S(3,2);宏展开:area=3*2;宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号()不能加空格例
#defineS(r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)PI*r*r”
例
#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)((x)*(x))宏展开:z=((x+y)*(x+y));2023/10/740#defineMAX(x,y)(x)>(y)?(x):(y)…….voidmain(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展开:t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}voidmain(){inta,b,c,d,t;…….t=max(a+b,c+d);………}【例】用宏定义和函数实现同样的功能2023/10/741带参的宏与函数区别带参宏函数处理时间编译时程序运行时参数类型无类型问题定义实参、形参类型处理过程不分配内存,简单的字符置换分配内存,先求实参值,再代入形参程序长度变长不变运行速度不占运行时间调用和返回占时间2023/10/7427.2文件包含处理过程
功能一个源文件可将另一个源文件的内容全部包含进来
一般形式#define<包含文件名>或
#define“包含文件名”
预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译<>:
直接到系统指定的“文件包含目录”去查找被包含的文件“
”:系统首先到当前目录下查找被包含文件,如果没找到,再到系统指定的“文件包含目录”去查找。
预编译处理后A源文件prg1.cpp#include"prg1.cpp"
B源文件prg2.cppBA新源文件prg2.cpp2023/10/743文件包含举例:#include"head.h"
#include"func.cpp"
voidmain(){inta,b,c;a=getnum();b=getnum();c=max(max(a,b),NUM);printf("MAX=%d\n",c);}(stdio.h文件中的内容)
#defineNUM10intmax(intx,inty){return(x>y?x:y);}intgetnum(){inta;scanf("%d",&a)return(a);}voidmain(){inta,b,c;a=getnum();b=getnum();c=max(max(a,b),NUM);printf("MAX=%d\n",c);}#include<stdio.h>#defineNUM10intmax(intx,inty){return(x>y?x:y);}intgetnum(){inta;scanf("%d",&a)return(a);}预编译处理后2023/10/744文件包含的优点:
一个大程序,通常分为多个模块,并由多个程序员分别编程。有了文件包含处理功能,就可以将多个模块共用的数据(如符号常量和数据结构)或函数,集中到一个单独的文件中(如上例中的文件head.h和func.cpp)。这样,凡是要使用其中数据或调用其中函数的程序员,只要使用文件包含处理功能,将所需文件包含进来即可,不必再重复定义它们,从而减少重复劳动。文件包含的几点说明
常用在文件头部的被包含文件,称为“标题文件”或“头部文件”,常以.h(head)作为后缀,简称头文件。在头文件中,除可包含宏定义外,还可包含外部变量定义、结构类型定义等。
一条包含命令,只能指定一个被包含文件。如果要包含n个文件,则要用n条包含命令。
文件包含可以嵌套,即被包含文件中又包含另一个文件。2023/10/7457.3条件编译根据一定的条件去编译源文件的不同部分,这就是条件编译。1、#if~#endif形式
格式:#if
条件1
程序段1#elif条件2
程序段2……#else
程序段n#endif常量表达式。通常会用到宏名,条件可以不加括号“()”
#elif和#else可以没有
#endif必须存在,它是#if命令的结尾
如果条件1为真就编译程序段1,否则如果条件2为真就编译程序段2,…,如果各条件都不为真就编译程序段n。
作用:
#if和#elif常常与defined命令配合使用,defined命令的格式为:
defined(宏名)或defined宏名功能:判断某个宏是否已经定义,如果已经定义,defined命令返回1,否则返回0。Defined命令只能与#if或#elif配合使用,不能单独使用。例如:#ifdefined(USA)的含义是“如果定义了宏USA”。
2023/10/746例:下面的程序利用ACTIVE_COUNTRY定义货币的名称
#defineUSA0#defineENGLAND1#defineFRANCE2#defineACTIVE_COUNTRYUSA
#ifACTIVE_COUNTRY==USA
char*currency=“dollar”;
//有效
#elifACTIVE_COUNTRY==ENGLANDchar*currency="pound"
;#elsechar*currency="france"
;#endifvoidmain(){floatprice1,price2,sumprice;scanf("%f%f",&price1,&price2);sumprice=price1+price2;printf("sum=%.2f%s",sumprice,currency);}char*currency=“dollar”;
voidmain(){floatprice1,price2,sumprice;scanf("%f%f",&price1,&price2);sumprice=price1+price2;printf("sum=%.2f%s",sumprice,currency);}预编译处理后2023/10/7472、#ifdef~#endif形式
格式:#ifdef宏名程序段1#else
程序段2#endif等价于“#ifdefined(宏名)”
在#ifdef和#else之间可以加多个#elif命令如果宏名已被#define行定义,则编译程序段1,否则编译程序段2
作用:#defineINTEGER#ifdefINTEGER
intadd(intx,inty)//有效
{return(x+y);}#elsefloatadd(floatx,floaty){return(x+y);}#endifvoidmain(){#ifdefINTEGER
inta,b,c;//有效
scanf("%d%d",a,b);printf("a+b=%d\n",add(a,b));#elsefloata,b,c;scanf("%f%f",a,b);printf("a+b=%f\n",add(a,b));#endif}intadd(intx,inty)//有效
{return(x+y);}voidmain(){inta,b,c;//有效
scanf("%d%d",a,b);printf("a+b=%d\n",a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林艺术学院《数字空间形态设计》2021-2022学年第一学期期末试卷
- 吉林艺术学院《电脑美术3D设计》2021-2022学年第一学期期末试卷
- 2024年多台挖机租赁合同范本
- 2024年大棚维修建设合同范本
- 驾校摩托车转让协议书范文范本
- 2022年北京市公务员录用考试《行测》真题及答案解析
- 吉林师范大学《公司法学》2021-2022学年期末试卷
- 能源企业环保自查工作制度
- 吉林师范大学《法理学》2021-2022学年第一学期期末试卷
- 2024标准室内设计合同
- 智能取餐柜项目计划书
- 国际法与国际争端解决中的人权保护与难民问
- 运筹学课件-运筹学完整课件(1-8章)
- 2024年中国出版集团公司招聘笔试参考题库含答案解析
- 学校教育促进学生的情感管理和社交技能培训课件
- 《有趣的符号》幼儿园课件
- 城轨行车组织-联锁故障时的列车运行组织
- 2023年体育单招数学真题及答案
- 储能技术在交通领域的应用
- 视网膜动脉阻塞治疗及护理
- SHT 3425-2011 石油化工钢制管道用盲板
评论
0/150
提交评论