樊媛媛《c语言程序设计》09-编译预处理

合集下载

C语言编译预处理PPT课件

C语言编译预处理PPT课件

知识点精讲
知识点2 不带参数的宏定义
知识点分析 用一个指定的标识符(即名字)来代表一个字符串,其一般形式如下: #define 标识符 字符串 例如: #define PI 3.1415926 1.宏定义的作用是在本程序文件中用指定的标识符PI来代替3.141 592 6这个字符串。在编译 预处理时,将程序中在该命令后出现的所有PI都用3.141 592 6代替。这种方法使用户能够以一个 简单的名字代替一个长的字符串。 2.这个标识符(名字)称为“宏名”。 3.在预处理时,将宏名替换成字符串的过程称为“宏展开”。“#define”是宏定义命令。 例如: #include "stdio.h" #define PI 3.1415926 /*定义了一个不带参数的宏*/
知识点精讲
int sum=ADD ( m+n)*k; printf("sum=%d", sum); } 2.下列程序的运行结果是____s_u_m_=_1_2_______ #define ADD(x)(x)+(x) void main( ) { int m=1,n=2,k=3; int sum=ADD(m+n)*k; printf("sum=%d", sum); } 3.下列程序的运行结果是______2_8________ #include <stdio.h> #define f(x) x*x main( )
void main( )
{
printf("L=%f\nS=%f\n",L,S);
getch( );
}
知识点精讲
知识点3 带参数的宏定义
真题回顾 (2021年真题)计算圆的面积s(公式为s=3.14r2)。请补全下列代码。 #include<stdio.h>

c语言教程9

c语言教程9
int factorial(int num) {
if(num==0) return 1;
else {
#ifddeeffiDneEdB(UDGEBUG) static int i; printf(“call times:%d,num=%d\n”,++i,num);
#endif return(factorial(num-1)*num); } }
b=(a)*(a)*(a)
a=? b=?
b=CUBE(a++)
b=(a++)*(a++)*(a++)
int cube(int x) {
return x*x*x; }
void main () {
… int b=0,a=3; bb==ccuubbee((aa+);+); }
2. 文件包含 文件包含格式:
#else 语句或预处理命令表列2
#endif
格式3:
#ifndef 标识符 语句或预处理命令表列
#endif
或 #ifndef 标识符 语句或预处理命令表列1 #else 语句或预处理命令表列2 #endif
#include<stdio.h> /#/d#edfienfeinDeEDBEUBGUG
END
直接在C系统的include目 录中查找该文件
#include<文件名> 或
#include ”文件名” 先从源程序所在的当前目 录中查找该文件;如果找 不到的话,再到include 中 查找
3. 条件编译 条件编译是源文件内系统级的选择结构,用于控制编译器
有选择地对源程序中的某个部分进行编译或不进行编译。

谭浩强--C语言程序设计09

谭浩强--C语言程序设计09

9.1 编译预处理(续)
9.1.1 不带参数的宏定义p187
命令的一般格式:
#define 宏名 字符串
4
宏定义的功能: 在进行编译前,用字符串原样替换程序中的 宏名。 这个替换过程称为“宏替换”或“宏展开”, 字符串也称为替换文本。
9.1 编译预处理(续)
例如: #define PI 3.14
9.1 编译预处理(续)
10
【例9.3】分析下面程序运行后的输出结果。 #define MA(x) x*(x-1) 特别注意: main( ) 由于替换文 { int a=1,b=2; 本中的x没 有用括号括 printf("%d\n", MA(1+a+b)); 起,因此, } 1+a+b也不 程序输出结果:8 能用括号括 分两次替换: 起。 ①MA(1+a+b) 用x*(x-1) 替换。 ②用1+a+b替换x。 printf语句被展开为: 例903 printf("%d\n", 1+a+b*(1+a+b-1));
9.1编译预处理(续)
2.功能
在预处理时,将include命令后指定文件的内 容替换该命令行。 例如:调用sin(x) 函数时,要在程序的开头使用 如下命令: #include <math.h> 在预处理时,用math.h文件内容替换 #include <math.h>命令行。
13
9.2 多文件程序的调试方法p184
例9021-2
9.1 编译预处理(续)
9.1.2 带参数的宏定义
命令的一般形式 #define 宏名(形参表) 字符串

第8章 编译预处理

第8章 编译预处理

11
第8章 编译预处理
8.2 文件包含@include
12
所谓“文件包含”处理是指一个源文件可以将另外一个源 文件的全部内容包含进来,即将另外的文件包含到本文件之 中。C语言提供了#include命令用来实现“文件包含”的 操作。一般形式为: #include “文件名” 或 #include <文件名> 在程序设计中,文件包含是很有用的。有些公用的符号常 量或宏定义等可单独组成一个文件,在其他文件的开头用 包含命令包含该文件即可使用。这样,可避免在每个文件 开头都去书写那些公用量,这样可以节省时间、减少出错。 对于C系统提供的标准库函数,也可以通过文件包含使之 包含到当前的程序里,从而实现库函数的调用。例如在前 面章节中已经用到的文件包含处理:
宏定义#define
2. 带参有宏定义
在以上例子中,要注意如下问题: (1)带参宏定义中,宏名和形参表之间不能随 便加入空格;否则将空格以后的字符都作为替代 字符串的一部分。 例如把上例中的宏定义: #define MAX(x,y)(x>y)?x:y 写成: #define MAX (x,y)(x>y)?x:y 将被认为是无参宏定义,宏名定义MAX代表字符 串(x,y)(x>y)?x:y 。 在上例中的宏定义语句中插入空格后,编译将失 败。
13
第8章 编译预处理
8.2 文件包含@include (4) 如果文件file1包含文件file2,而在文件file2中又要包含文件file3的 内容,则可在文件file1用两个#include命令分别包含文件file2和文件 file3,而且文件file3要出现在文件file2之前,即在文件file1.c中定义: #include <file3.h> #include <file2.h> 这样file1和file2都可以用file3的内容。 (5) 在一个被包含文件中又可以包含另一个被包含文件,即文件包含 是可以嵌套的。 (6) 被包含文件(如file2.h)与其所在文件(如file1.c),经编译预处理后 已成为同一文件,因此,如果file2.h中有全局静态变量,它在文件 file1.c中有效,不必用extern声明。

《C语言程序设计教程(第4版)》第6章编译预处理

《C语言程序设计教程(第4版)》第6章编译预处理
令行后出现的宏名用宏体代替。
实例
#define PI 3.1415926
main() {float a,s,r;
宏调用
printf("Input radius r:");
scanf("%f", &r);
宏替换后:
a=2*PI*r;
a=2*3.1415926*r;
s=PI*r*r;
s=3.1415926*r*r;
宏名在源程序中若用引号引起来,则预处理程序不
对其作宏代换。如:#define no 220
main()
不替换Biblioteka { printf(“no”); }
说明
宏定义可以嵌套:
在宏体中可以使用已经定义的宏名。在宏展
开时由预处理程序层层代换。
以下程序中的for循环执行的次数是( )。 思考
#define N 2
scanf("%d",&y);
s=3*My*y+3*y +4*My*y+3*y
printf("s=%d\n",s);
}
(y*y+3*y) (y*y+3*y)
+5*My;*y+3*y (y*y+3*y)
带参宏定义
一般形式: #define 宏名(形参表) 宏体
宏调用:宏名(实参表)
宏替换:编译预处理时用宏体代换带参宏,同时 用实参代换形参
如:有参宏 # define AS(x,y,z) x+y+z
无参宏定义
一般形式: #define 宏名 宏体 define:宏定义命令 宏名:由标识符定义 宏体:为一字符串(常量、表达式、格式串等) define、宏名、宏体之间用空格隔开

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

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

C语言程序设计 CPD_10 更多课件请进我文库

C语言程序设计 CPD_10 更多课件请进我文库
3
计算机程序设计基础
北京工商大学 何渝
从C/C++程序看编译预处理
原 来 现 编 在 辑
编 辑
预 编 译 编 译

连 接 连 运

接 行
4
运 行
计算机程序设计基础
北京工商大学 何渝
10.2 宏替换(宏定义)
程序中可以用#define命令定义字符串宏
替换: #define 宏名 宏体 使用宏替换的好处: 1. 提高程序的可读性。如一些常数。 2. 易修改性。如需要多处修改相同内容
何 渝 北京工商大学 计算机与信息工程学院
计算机程序设计基础
北京工商大学 何渝
本章主要内容
• 编译预处理 • 多文件编程
2
计算机程序设计基础
北京工商大学 何渝
§10.1 编译预处理
编译预处理是C/C++特有的功能,它是在编译 前对源程序进行的一些预加工处理,由编译系统中 的预处理程序按源程序的预处理命令进行处理。 C/C++语言的预处理均以#号打头,末尾不加 分号,以区别于函数和变量的声明。它们可出现在 程序中的任何位置,其作用域是自出现点到所在源 程序的末尾。 编译预处理是C/C++的一个重要特性。它能改 善程序设计的环境,有助于编写易移植、易维护的 程序,也是模块化程序设计的一个工具。包括: 1. 宏替换 2. 文件包含 3. 条件编译
6
计算机程序设计基础
北京工商大学 何渝
注:
• 宏替换中的宏体不仅可以是字符串常数,也可是
表达式或语句组成的字符串,还可是多个语句,如: #define PI 3.1416 #define RADIUS 2.0 #define CIRCUM return(2.0*PI*RADIUM) • C中定义常量,在C++中用const语句代替,如: const PI=3.14;

c语言编译过程详解

c语言编译过程详解

C语言编译过程通常分为预处理、编译、汇编和链接四个步骤。

以下是C语言编译过程的详细解释:
1. 预处理:在编译之前,预处理器会对源代码进行预处理。

预处理包括以下步骤:
-删除源代码中的注释
-展开宏定义
-处理文件中的预定义符号
2. 编译:编译器将预处理后的代码转换成中间代码(即汇编语言)。

编译器会对源代码进行词法分析、语法分析和优化,生成目标代码(即汇编语言)。

3. 汇编:汇编器将汇编代码转换成机器指令。

汇编器将汇编指令转换成机器指令,并将它们组合成可执行的程序。

4. 链接:链接器将多个目标文件组合成一个可执行文件或共享库文件。

链接器会解决符号引用问题,并将它们链接到相应的代码段和数据段。

在C语言编译过程中,编译器和链接器通常使用标准库和用户定义的库。

标准库提供了一些常用的函数和数据类型,如printf()和malloc()。

用户定义的库可以包含自定义的函数和数据类型,以便更好地满足应用程序的需求。

总之,C语言编译过程是一个复杂的过程,需要多个步骤和工具的协同工作。

正确的编译过程可以确保生成的可执行程序具有良好的性能和可靠性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define S(a,b) a*b area=S(3,2); 定义宏名S代表矩形面积,参数a,b为边长。 宏展开过程:
ppt课件
7
9.2 文件包含处理 在一个源文件中将另一个源文件的内容包 含进来。 文件包含指令的一般形式: #include “文件名” 或 #include <文件名>
ppt课件
第九章 编译预处理
C语言提供了一些以#开头的指令,如:
#define #include 等。
这些指令是在编译以前就事先进行处理的,因 而称为“编译预处理”指令。
可以用编译预处理指令实现以下三种功能:
1) 宏定义
2) 文件包含
3) 条件编译
பைடு நூலகம்
ppt课件
1
9.1 宏定义 1、不带参的宏定义 用一个指定的标识符(宏名)代表一个字符串。 一般形式: #define 标识符 字符串 如:#define PI 3.1415926 有了这一宏定义后,程序中凡是用到3.1425926 的地方都可以以宏名PI出现。
f.h
#define PI 3.1415926 float f1(float r); float fac(int n);
ppt课件
11
此课件下载可自行编辑修改,供参考! 感谢您的支持,我们努力做得更好!
——宏展开。
ppt课件
3
例:定义一个宏名来代表一个数据个数。eg9-02.c #define N 100 main() { int a[N],i; float s=0;
for(i=0;i<N;i++)scanf(“%d”,&a[i]); for(i=0;i<N;i++)s+=a[i]; s/=N; printf(“\n %f”,s); } 宏名N---符号常量,可以作为数组说明的长度。 方便修改参数。
ppt课件
5
注意以下程序的运行结果: eg9-04.c
#define F1 x+y
#define F2 (x+y)
main()
{ int x=3,y=5,z1,z2;
z1=2*F1;
z2=2*F2;
printf(“\n %d”,z);
}
ppt课件
6
2、带参的宏定义 宏定义也可以带参数,其一般形式为: #define 宏名(参数表) 字符串 如: eg9-05.c
8
file1.c
#include “file2.c”
file2.c
B
A
file1.c
B A
ppt课件
9
例:
#include “math.h”
main()
{ float a,b,c,s,area;
scanf(“%f%f%f”,&a,&,&c);
s=0.5*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
ppt课件
4
例:定义一个宏名来代表一个计算公式。eg9-03.c #define PI 3.1415926 #define AREA PI*r*r main() { float r=3,s;
s=AREA; printf(“\n %f”,s); } 注意:系统对宏定义的预处理是一个字符串的还原过 程,不要把宏名看成一个整体。
ppt课件
2
例:定义一个宏名来代表一个参数。eg9-01.c #define PI 3.1415926 main() { float r=1.0,c,s; c=2*PI*r; s=PI*r*r; ┈}
系统在对程序进行编译以前,首先将所有的编
译预处理指令进行预处理,对本例来说,就是
将程序中所有的宏名PI还原成3.1415926,
printf(“\n %f”,area);
}
ppt课件
10
f.c
#include “f.h” main() { printf(“\n%f”,f1(3.0)); printf(“\n %f”,fac(10)); } float f1(float r) { return(PI*r*r); } float fac(int n) { int i; float s=1; for(i=1;i<=n;i++) s*=i; return(s); }
相关文档
最新文档