C语言程序设计第9章(预处理命令)

合集下载

c语言程序设计课程教学大纲(计算机科学与技术)

c语言程序设计课程教学大纲(计算机科学与技术)

甘肃民族师范学院计算机专业课程教学大纲C语言程序设计一、说明(一)课程性质必修课(二)教学目的本课程是为计算机类等本、专科学生开设的,以培养学生程序设计能力为目的的专业基础课,是学习其他专业课的基础,同时也是第一门高级语言程序设计课。

本课程的任务是结合一般数值计算向学生介绍计算机程序设计的基本知识,使学生掌握C语言的基本语法,掌握程序设计的基本思想、基本概念和基本方法和技巧,并能运用所学的知识和技能对一般问题进行分析和程序设计,编制出高效的C 语言应用程序;同时了解进行科学计算的一般思路,培养应用计算机解决和处理实际问题的思维方法与基本能力,为进一步学习和应用计算机打下基础。

(三)教学内容计算机程序语言发展史,结构化程序设计的三种基本结构,函数,数组,指针,文件。

(四)教学时数90学时,60理论,30上机(五)教学方式多媒体授课二、本文第一章C语言程序设计基础教学要点:C程序的基本结构。

上机环境,进行简单C程序的编写。

教学时数:4学时(理论3学时,上机1学时)教学内容:第一节概述程序设计语言的发展。

C程序的基本结构。

第二节开发环境上机环境,进行简单C程序的编写。

考核要求:1.掌握编写C语言程序的基本步骤。

2. 掌握上机调试过程。

第二章数据类型、运算符与表达式教学要点:数据类型。

表达式。

输入输出函数。

教学时数:12学时(理论8学时,上机4学时)教学内容:第一节数据类型整型、实型、字符型、枚举型、构造类型、指针。

第二节常量与变量第三节运算符与表达式算术运算符及表达式、关系运算符及表达式、逻辑运算符及表达式、逗号运算符及表达式、条件运算符及表达式、赋值运算符及表达式。

第四节标准输入/输出scanf()函数、printf()函数。

第五节数学函数数学库头文件<math.h>。

第六节随机数发生器函数rand()和srand()函数,对应的头文件“stdlib.h”。

考核要求:1.理解数据结构、常量、变量的概念;2.掌握各种运算符的优先级及结合方向;3.熟练掌握数据的输入、输出方法;4.了解其他数学函数及随机函数的使用方法。

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。

可见预处理过程先于编译器对源代码进行处理。

在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。

要完成这些工作,就需要使用预处理程序。

尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。

预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。

预处理过程还会删除程序中的注释和多余的空白字符。

预处理指令是以#号开头的代码行。

#号必须是该行除了任何空白字符外的第一个字符。

#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。

整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

下面是部分预处理指令:指令用途#空指令,无任何效果#include包含一个源代码文件#define定义宏#undef取消已定义的宏#if如果给定条件为真,则编译下面代码#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码#endif结束一个#if……#else条件编译块#error停止编译并显示错误信息一、文件包含#include预处理指令的作用是在指令处展开被包含的文件。

包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。

标准C编译器至少支持八重嵌套包含。

预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。

这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。

例如:#defineAAA#include"t.c"#undefAAA#include"t.c"为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语言的预处理指令分3种  1宏定义  2条件编译  3文件包含

c语⾔的预处理指令分3种 1宏定义 2条件编译 3⽂件包含宏简介1.C语⾔在对源程序进⾏编译之前,会先对⼀些特殊的预处理指令作解释(⽐如之前使⽤的#include⽂件包含指令),产⽣⼀个新的源程序(这个过程称为编译预处理),之后再进⾏通常的编译所有的预处理指令都是以#开头,并且结尾不⽤分号2.预处理指令分3种 1> 宏定义 2> 条件编译 3> ⽂件包含3.预处理指令在代码翻译成0和1之前执⾏4.预处理的位置是随便写的5.预处理指令的作⽤域:从编写指令的那⼀⾏开始,⼀直到⽂件结尾,可以⽤#undef取消宏定义的作⽤6.宏名⼀般⽤⼤写或者以k开头,变量名⼀般⽤⼩写 宏定义可以分为2种:不带参数的宏定义和带参数的宏定义。

⼀、不带参数的宏定义1.⼀般形式#define 宏名字符串⽐如#define ABC 10右边的字符串也可以省略,⽐如#define ABC2.作⽤它的作⽤是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常⽤来定义常量.3.使⽤习惯与注意1> 宏名⼀般⽤⼤写字母,以便与变量名区别开来,但⽤⼩写也没有语法错误2> 对程序中⽤双引号扩起来的字符串内的字符,不进⾏宏的替换操作。

3> 在编译预处理⽤字符串替换宏名时,不作语法检查,只是简单的字符串替换。

只有在编译的时候才对已经展开宏名的源程序进⾏语法检查4> 宏名的有效范围是从定义位置到⽂件结束。

如果需要终⽌宏定义的作⽤域,可以⽤#undef命令5> 定义⼀个宏时可以引⽤已经定义的宏名#define R 3.0#define PI 3.14#define L 2*PI*R#define S PI*R*R举例1 #include <stdio.h>2#define COUNT 434int main()5 {6char *name = "COUNT";78 printf("%s\n", name);910int ages[COUNT] = {1, 2, 67, 89};1112#define kCount 41314for ( int i = 0; i<COUNT; i++) {15 printf("%d\n", ages[i]);16 }1718// 从这⾏开始,COUNT这个宏就失效19#undef COUNT2021//int a = COUNT 写这个报错2223return0;24 }⼆、带参数的宏定义1.⼀般形式#define 宏名(参数列表) 字符串2.作⽤在编译预处理时,将源程序中所有宏名替换成字符串,并且将字符串中的参数⽤宏名右边参数列表中的参数替换3.使⽤注意1> 宏名和参数列表之间不能有空格,否则空格后⾯的所有字符串都作为替换的字符串2> 带参数的宏在展开时,只作简单的字符和参数的替换,不进⾏任何计算操作。

c语言程序设计基础教程课后答案

c语言程序设计基础教程课后答案

c语言程序设计基础教程课后答案C语言程序设计基础教程课后答案第一章:C语言概述1. 简述C语言的特点。

- C语言是一种结构化编程语言,具有高效、灵活、功能强大等特点。

- 它支持多种编程范式,如过程式编程、结构化编程、面向对象编程等。

- C语言具有较低的抽象级别,接近硬件,因此执行效率较高。

2. C语言的发展历史。

- C语言在1972年由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发。

- 它最初是作为UNIX操作系统的系统编程语言而设计的。

第二章:C语言环境和基本语法1. 如何设置C语言的开发环境?- 选择一个C语言编译器,如GCC、MSVC等。

- 安装编译器并配置环境变量,以便在命令行中直接调用编译器。

2. C语言的基本语法结构是什么?- C语言的基本结构包括预处理指令、函数定义、变量声明和语句。

第三章:数据类型、运算符和表达式1. C语言中的基本数据类型有哪些?- 整型(int)、字符型(char)、浮点型(float和double)等。

2. 运算符的分类及其用法。

- 算术运算符:+、-、*、/、%等。

- 赋值运算符:=、+=、-=等。

- 比较运算符:==、!=、>、<等。

- 逻辑运算符:&&、||、!等。

第四章:控制语句1. 条件语句的用法。

- if语句用于基于条件执行代码块。

- switch语句用于多条件选择。

2. 循环语句的用法。

- while循环用于在满足条件时重复执行代码块。

- for循环用于已知迭代次数的循环。

- do-while循环先执行代码块再判断条件。

第五章:数组和字符串1. 数组的基本概念和使用。

- 数组是相同数据类型的元素集合,存储在连续的内存位置。

- 声明数组:int arr[10]; 表示一个包含10个整数的数组。

2. 字符串的表示和操作。

- 在C语言中,字符串是以空字符('\0')结尾的字符数组。

- 使用标准库函数如strcpy、strlen等操作字符串。

C语言程序设计教程CJ_04预处理命令_潭浩强第3版

C语言程序设计教程CJ_04预处理命令_潭浩强第3版

Page 6
辽宁师范大学
蔡静
带参宏替换 函数调用 编译时替换, 运行时调用, 编译时替换 不占用内存 运行时调用 占用内存 只替换不计算 计算 替换使程序代码加长 不加长 存在数据类型问题 不存在数据类型问题
Page 7
辽宁师范大学
蔡静
9.2 “文件包含 处理 文件包含”处理 文件包含
通过预处理命令#include把另一个文件的全部内容包含到本 文件中。 格式1: #include <文件名 文件名> 文件名 只按系统指定的标准方式(从编译系统所在子目录中)检索 文件目录。 格式 2: #include “文件名” 文件名” 文件名 系统首先在当前源文件所在目录中寻找该文件,若找不到, 再按系统指定的标准方式检索其他文件目录。 例:9.6
Page 9
辽宁师范大学
蔡静
Thanks
Page 8
辽宁师范大学
蔡静
9.3 条件编译
指定满足某条件才能对指定语句进行编译,称为条件编译。 几种形式: 程序段2】 程序段 】 #endif
#ifndef 标识符 程序段1 程序段 【#else 程序段2】 程序段 】 #endif
#if 表达式 程序段1 程序段 【#else 程序段2】 程序段 】 #endif
Page 5
辽宁师范大学
蔡静
二、带参数的宏替换/宏定义 带参数的宏替换 宏定义
格式: #define 宏名 形参表 宏名(形参表 形参表) 例:#define S(M, N) M*N
字符串
说明: 带参数的宏定义不是进行简单字符串替换,还要进行参数 替换。形参表列中的参数出现在字符串中。 宏展开只是将程序语句中宏名后括号内的实参代替 #define命令中的形参,并不计算。 宏名与其后括号间不能有空格。 例9.3-9.5:

预处理命令

预处理命令

二、表演区 (一)什么是表演区 表演区以幼儿表演游戏为设计核心,通过道具吸引幼儿积极参加故事表 演、游戏等活动。 (二)表演区的环境布置与材料投放 表演区可以分为固定式和活动式表演区角两类。 固定式的表演区角是指在活动室内辟出一定区域,存放表演所需要的用 具。 活动式的表演区角则是根据表演需要,临时在走廊、门厅、过道或室外 等地方设置表演场所,便于及时放置和收拢。
第9章 预处理命令
• 9. 1 概述 • 9. 2 宏定义 • 9. 3 文件包含 • 9. 4 条件编译
9. 2 宏定义
• 9. 2. 1 无参宏定义
• 无参宏的宏名后不带参数。 • 其定义的一般形式为 • #define 标识符字符串 • 其中, #表示这是一条预处理命令; 凡是以#开头的指令均为预处理命
果果:“老师,一分钟是多久呢?” 教师:“就是一会儿,我一转身。” 贝贝:“我知道,最细的秒针走一圈,挺长的。” 佳佳:“一分钟就是我们从门口走到后面的窗子那里。” 教师:“一分钟能做什么?” 佳佳:“给花浇水。” 果果:“唱完一首歌。” 贝贝:“搬来一把椅子。”……
学习目标
1. 了解幼儿日常交谈的主要特点及指导要求。 2. 掌握语言区角的环境布置与材料投放要求,能科学地开展语言区角活 动的指导。 3. 学会设计听说游戏的玩法,并能评析幼儿园听说游戏。
上一页 下一页 返回
9. 2 宏定义
• 【例9 - 2】不作宏代换程序举例。
上一页 下一页 说明: • 虽然已定义宏名OK 表示100, 但在printf 语句中OK 被引号括起来, 因
此不作宏代换。 • 程序的运行结果为“OK”, 这表示把“OK” 当字符串处理。
上一页 下一页 返回
义时, 必须十分注意, 应保证在宏代换之后不发生错误。

C语言程序设计教程(电子教案)

实用文档
学习目标
对C语言有一个概括的了解, 能够编写包含键盘输入、计算和 显示输出等操作的简单C程序。
4
主要内容
• C语言的产生与特点 • 简单C程序的组成 • C语言应用程序开发的基本步骤
5
1.1 C语言的产生及特点
C语言是为了编写系统程序而在1968年开始 研发的计算机高级语言
C语言表达能力强,使用灵活,程序结构清 晰,紧凑,可移植性好
指针 类型
17
基本数据类型说明符
整型:int long
字符型:char 实型:float
double long double
18
2.2 常 量
常量∶在程序运行过程中,其值不能被改 变的量。
一. 不同数制整型常量的表示
例如: 12 :十进制数 12
012 :八进制数 12(等于十进 制数10,用前导符0表示八进制数常量)
计算x+y+z,并将结 8果赋给变量sum
显示变量 sum的值
主函数 main()
一般C程序的组成
【例1-2】采用模块结构,改写例1-1的程序。 add(int x,int y,int z )
{ return(x+y+z);
}
函数add()
调用函数 add()
main() { int x,y,z; printf("Please Input Three Integers:\n "); scanf("%d,%d,%d ",&x,&y,&z);
4. 用‘\’ ’表示字符’ ,‘\”’表示字符”, ‘\\ ’表示字符\ 。
5. 用双引号括起来的字符序列表示字符串常量,其 中最后一个字符是字符串结束符‘\0’,不显式 地表示出来。如:“English” 。

浙江农林大学C语言程序设计习题集答案

第1~3章C语言概述、算法、数据类型、运算符与表达式一、选择题ACDCB CCDCB D二、填空题1、n=202、a=66,b=E第4章顺序程序设计一、选择题BAAD二、程序阅读1、12 240 122、2,3,2,23、0三、编程1#include <stdio.h>#include <math.h>void main(){float a,b,c,s,area;scanf("%f,%f,%f",&a,&b,&c);s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("a=%f,b=%f,c=%f,area=%f",a,b,c,area);}2#include <stdio.h>#include <math.h>void main(){float a,b,c,del,x1,x2;scanf("%f,%f,%f",&a,&b,&c);del=b*b-4*a*c;if (del>=0){x1=(-b+sqrt(del))/(2*a);x2=(-b-sqrt(del))/(2*a);printf("x1=%f,x2=%f",x1,x2);}elseprintf("没有实根");}3#include <stdio.h>void main(){int c,f;c=26;f=9.0/5.0*c+32;printf("%d的华氏温度是%d",c,f);}第5章选择结构程序设计一、选择题DBBCDC二、程序阅读1、|a|+|b|=612、PQ3、-14、60~9060error!5、0,16、x+y+z=15三、编程1#include <stdio.h>void main(){int a,b,c,min;scanf("%d,%d,%d",&a,&b,&c);min=a;if (min>b) min=b;if (min>c) min=c;}2#include <stdio.h>void main(){int a;scanf("%d",&a);if(a%3==0 && a%5==0 && a%7==0)printf("yes");elseprintf("no");}3#include <stdio.h>#include <math.h>void main(){float x,y;scanf("%f",&x);if (x<0)y=fabs(x);else if(x>=0 && x<=2)y=sqrt(x+1);else if (x>=2 && x<4)y=pow(x+2,3);elsey=2*x+5;printf("x=%f,y=%f",x,y);}4#include <stdio.h>void main(){float rate,tax,salary;scanf("%f",salary);if(salary<=850)rate=0;else if(salary>1350 && salary<=2850)rate=0.1;else if(salary>2850 && salary<5850)rate=0.15;elserate=0.2;tax=rate*(salary-850);printf("salary=%f,rate=%f,tax=%f",salary,rate,tax);}5#include <stdio.h>void main(){int a,b,sum,n;scanf("%d,%d",a,b);sum=a*a+b*b;if(sum>100){n=sum/100;printf("a*a+b*b=%d,n=%d",sum,n);}elseprintf("a*a+b*b=%d",sum);}第6章循环控制一、填空题:1、222、233、464、117二、选择题:1.C2.D3.B4.B5.B6.C7.C8.C9.B 10.D三、程序阅读:1、输出:332、输出:243、2#4#7#11#16#4、3#2#0#0#1#5、B,A,D,C6、D,A,B,C7、B,C,A,D8、A,D,D,C9、C,C,A10、B,D,A11、A,D,C四、编程1.#include <stdio.h>#include <math.h>void main(){ int x;printf("x sqrt(x)\n");for(x=5;x<=1000;x++)printf("%d %f\n", x, sqrt(x));}2.#include<stdio.h>#include<math.h>main(){int i,flag;double pi,item;i=1;flag=1;pi=0;item=1.0;while(fabs(item)>=0.00001){ item=flag*1.0/i;pi=pi+item;flag=-flag;i=i+2;}pi=pi*4;printf("pi=%f",pi);}3.教材126页例6.84.#include<stdio.h>main(){ int i,num1,num2,num3;num1=1;num2=1;printf("%d %d ",num1,num2);for(i=3;i<=10;i=i+1){num3=num1+num2;printf("%d ",num3);num1=num2;num2=num3;}}第7章数组一、选择题:1. D2.D3.A4.C5.C6.C7.D8.B9.D 10.B 11.D 12.D13.D 14.A 15.B二、程序阅读:1、A,B,B,D2、C,D,A,B4、D,C,A5、C,D6、C,A7、1#2#3#1#1#38、298三、编程:1、#include <stdio.h>void main( ){int mark, a, p, f;a = p = f = 0;printf("Enter scores:");scanf ("%d", &mark);while (mark >0){if(mark >= 85) a++;else if (mark >= 60) p++;else f++;scanf ("%d", &mark);}printf(">=85:%d\n", a);printf("60-84:%d\n", p);printf("<60:%d\n", f);}2、#include <stdio.h>void main( ){ int a[10],count=0,i;float average,sum=0;for(i=0;i<10;i++){ scanf("%d",&a[i]);sum=sum+a[i];}average=sum/10;for(i=0;i<10;i++)if(a[i]>average) count=count+1;printf("平均值为%f 大于平均值的数有%d个",average,count); }3.#include<stdio.h>main( ){ int a[10];printf(“请输入一个正整数n(1<n≤10):”);scanf(“%d”,&n);printf(“请输入数据:”);for (i=0; i<n; i++)scanf("%d",&a[i]);printf("\n");for (j=0; j<n-1; j++) /*确定基准位置*/for(i=j+1; i<n; i++)if (a[j]>a[i]){ t=a[j];a[j]=a[i];a[i]=t; }printf("The sorted numbers: \n");for (i=0; i<n; i++)printf("%d",a[i]);}4.#include <stdio.h>void main(){int a[6][6],n,i,j,x,y,max;printf(“请输入一个正整数n(1≤n≤6):”);scanf(“%d”,&n);printf(“请输入一个n行n列的矩阵:\n”);for (i=0;i<n;i++)for (j=0;j<n;j++)scanf(“%d”,&a[i][j]);max=a[0][0]; x=0;y=0;for (i=0;i<n;i++)for (j=0;j<n;j++)if (fabs(a[i][j])>max) {max=a[i][j];x=i;y=j;}printf(“绝对值最大的元素为:%d,下标分别为:%d,%d\n”,max,x,y); }第8章函数一、选择题(1) A(2) B(3) C(4) B(5) A(6) C(7)i. Bii. Diii. A真诚为您提供优质参考资料,若有不当之处,请指正。

C语言程序设计 第3版 第9章 编译预处理

int s; s=sum(5); printf("s%d\n",s); }
#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2

第9章C语言


9.2.1 文件的打开
在C语言中,打开文件是由fopen()函数实现的,函数原型 如下: FILE *fopen( char *filename, char *mode ) 其中,filename和mode分别是所要打开文件的文件名和将要 对其操作的模式;函数的返回值是一个文件类型指针,指向 被打开文件的文件缓冲区(结构体变量)的起始地址。如果 文件打开失败,则函数返回值是一个NULL指针。 为了对已打开的文件进行操作,应该立即把fopen()函数 的返回值赋给一个文件类型指针变量,若没有立即把返回值 赋给一个文件类型指针,而进行其它操作,可能导致此函数 的返回值丢失,而无法对所打开的文件进行操作。 如果需要对磁盘文件file1.txt,进行读写操作,可用如下 方式打开这个文件:

9.3.1 输入和输出一个字符
(a)命令窗口中输入的命令 (b)读出的文件中的内容 图9-3 例9.1的执行结果
9.3.1 输入和输出一个字符



其中,“C Language!”是文件file1.txt中的内容。 需要注意的是,该程序是将打开文件中的字符,逐一 的取出并显示出来。直到遇到文件的结束标志,结束 读出操作。 可以通过该程序打开任意的文本文件,只要把所要打 开的文件名作为命令的参数即可。
9.1 文件概述
9.1.1 文件的基本概念 9.1.2 缓冲文件系统和非缓冲文件系统 9.1.3 文件类型指针
9.1.1 文件的基本概念
所谓文件是指记录在外部介质上的数据的集合。数据是 以文件的形式存放在外部介质上的。操作系统都是以文 件为单位对数据进行管理的,如果系统要从外部存储设 备上寻找需要的数据,系统首先找到该部分数据属于的 文件,根据文件名找到所指定的文件,然后从文件中读 出数据。如果要向外部存储设备上存储数据,也需要把 待存储的数据建立成文件,再以文件的形式向外输出。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明:
(1)一个include命令只能指定一个被包含文件,如果要 包含n个文件,要用n个include命令;
(2)如果file1.c文件包含file2.h文件,而文件file2.h要用 到file3.h的内容,则可在file1.c用两个include命令分别包 含文件file2.h和file3.h,而且file3.h应出现在file2.h之前。 即:
例9.1
#define PI 3.1415926 main( ) {
float l,s,r,v; printf("input radius:"); scanf("%f",&r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); }
• 宏替换不占运行时间只占编译时间。而函数调用则占 运行时间(分配单元、保现场、值传递、返回)。
9.2 “文件包含”处理
所谓“文件包含”处理是指一个源文件可以将另外 一个源文件的全部内容包含进来, 即将另外的文件包含 到本文件之中。C语言提供了#inc1ude命令用来实现“文 件包含”的 操作。其一般形式为
4)宏定义不是C语句,不必在行末加分号,如果
加了分号,则会连同分号以其进行替换; 如: #define PI 3.1415926; area = P*r*r; 在宏扩展后成为: area = 3.1415926;*r*r; 结果,在编译时出现语法错误。
5)宏名的有效范围为定义命令之后到本 源文件 结束。通常,#define命令写在文件开头,函数之前,作
第九章 预处理命令
编译预处理:在源程序文件中,加入“编译预处理命 令”,使编译程序在对源程序进行通常的编译(包括词 法分析、语法分析、代码生成、代码优化)之前,先对 这些命令进行预处理,然后将预处理的结果和源程序一 起再进行通常的编译处理,以得到目标代码(OBJ文件)。
C提供的编译预处理命令
宏命令(Macro)
为文件一部分,在此文件范围内有效。
6)可以用#undef命令终止宏定义的作用域。这样可以
灵活控制宏定义的作用范围。
7)在进行宏定义时,可以引用已定义的宏名,可以层层置 换。
例9.2 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main( ) {
说明:
1)宏名一般习惯用大写字母表示。非强制
规定,也可用小写字母;
2)使用宏定义,可以提高程序的通用性,能作 到“一改俱改”;
3)宏定义只作简单的替换,不作正确性检查。 如果词义或语义错误,只有在编译已被宏展开后 的源程序时才会发现错误井报错。例如:
#define PI 3.14l59 把第二个“1”写成“l”。这样的错误只有在 编译已被宏展开后的源程序时才会发现错误井报 错;
(3)对函数中的实参和形参都要定义类型,二者的类 型要求一致。不一致,应进行类型转换。而宏不存在 类型问题,宏名无类型,它的参数也无类型,只是一 个符号代表。
• 调用函数只可得到一个返回值,而用宏 可以设法得到几个结果。
• 使用宏次数多时,宏展开后源程序长,因为每展开一 次都使程序增长,而函数调 用不使源程序变长。
#inc1ude“文件名”

#include<文件名>
file1.c
file2.c
#includeB<file2.c>
B
A
这种常用在文件头部的被包含的文件称为“标题文件” 或“头部文件”,常以“h”为后缀(h为head(头)的 缩写),如“stdio.h”文件。当然不用“h”为后缀,而用 “c”为后缀或者没有后缀也是可以的,但用”h”作后缀 更能表示此文件的性质。
说明: (1)用宏名后面括号内的实参字符串原样代替#define 命令行中的形参。
如果有以下语句: area=S( a+b )
S( r )
PI *r * r
注意计算次序
area=PI*a+b*a+b
应当在定义时形式参数外面加一个括弧。
#define S(r) PI*(r)*(r)
(2)在宏定义时,在宏名与带参数的括弧之 间不应加空格,否则将空格以后的字符都作
例如
#define S(a,b) a*b
arear=S(2,3);
其中S(2,3)相当与2*3. 置换方式
从左到右进行置换。 形参用相应的实参(可以是常量、变量或表达式) 代替,不是参数字符,则保留。
Hale Waihona Puke 例9.3 #define PI 3.1415926 #define S(r) PI*r*r main( ) { float a,area; a=3.6; area=S(a); printf(“r=%f\narea=%f\n”,a,area); }
printf(“L=%f\nS=%f\n”,L,S); }
8)对程序中用双括号括起来的字符串内的字符,即使
与宏名相同,也不进行置换;
9)宏定义是专门用于预处理命令的一个专用名词,它与定
字符 义变量的含义不同,只作
替换,不分配内存空间;
9.1.2带参数的宏定义
一般形式 #define 宏名(参数表) 字符串 字符串中包含在括弧中所指定的参数。
为替代字符串的一部分,
参数的宏和函数的比较:
• 类似之处:在引用函数时也是在函数名后的括弧内写 实参,也要求实参与形参的数目相等,
• 带参的宏定义与函数的区别:
(1)函数调用时,先求出实参表达式的值,然后代入 形参。而使用带参的宏只是进行i简单的字符替换;
(2)函数调用是在程序运行时处理的,分配内存单元。 而宏展开是在编译时进行的,在展开时并不分配内存 单元,不进行值的传递处理,也没有“返回值”的概 念;
文件包含命令(include)
条件编译命令
这些命令均以#开头,以区别于语句。
9.1 宏定义
9.1.1不带参数的宏定义 一般形式:
#define 标识符 字符串 例:
#define PI 3.1415926 作用:
用标识符(称为“宏名” )PI来代替3.1415926这个字 符串,在编译预处理时,将程序中在该命令以后出现的所 有的PI都用3.1415926代替(这一过程又称为“宏展开”)。
相关文档
最新文档