大学计算机程序设计基础(C语言)--第7章编译预处理概论
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define LT 200 main( ) { int PLTER=10;……} 宏名LT不会替换变量名PLTER中的LT。
不带参数宏注意事项
5. 宏定义允许嵌套。即在进行宏定义时,可以在宏体中 使用已定义的宏名,在预处理时进行层层替换。 例 #define R 3.0 #define PI 3.14159 #define S PI*R*R main( ) { printf(“%f\n”,S); }
}
不带参数宏注意事项
1. 宏名通常用大写字母表示,这并不是语法规定,只是为 了与变量名区别。
2. 宏定义不是c语句,不必在行末加 ;号。 3. 宏定义的位置通常放在程序的开头,作为文件的一部分
,其作用域为从宏定义位置开始到此文件结束。但可以 用 “#undef 宏名”命令终止宏定义的作用域,这样 可以灵活控制宏定义的作用范围。 4. 若用户标识符中的一部分与宏名相同,则在预处理时不 对其进行替换。例如:
宏定义
在C语言源程序中允许使用“宏”,即用一个指定的 标识符表示一个字符串。其中标识符称为“宏名”, 字符串称为“宏体”。在编译预处理时,对程序中所 有出现的“宏名”,都用宏体去替换,这个替换过程 称为“宏代换”或“宏展开”。
C语言中的宏定义分为: 不带参数的宏定义和带参数的宏定义
不带参数的宏
不带参数宏定义一般形式:
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;
printf(“r=%f, a=%f, s=%f \n”, r,a,s);
#define 宏名 宏体
宏名:由标识符定义 宏体: 为一字符串 例如: #define PI 3.1415926 功能: 编程时用宏名PI来代替“3.1415926”
这个字符串,在编译预处理时,把程 序中在该命令以后出现的PI用 3.1415926替换。
不带参数宏举例
#define PI 3.1415926
说明:
1. 一个 #include 命令只能指定一个包含文件。 2. 文件包含可以嵌套。 3. 当包含文件修改后,对包含该文件的源程序必须重新进
行编译连接处理。 4. #include “文件名”形式,系统先在引用被包含文件源
文件所在目录中寻找,找不到再按标准方式检索其他目 录; #include <文件名>方式不检查源文件所在目录, 直接按标准方式检索文件目录。
6. 同一个宏名不能重复定义。
wenku.baidu.com
带参数的宏
带参数的宏定义一般形式: #define 宏名(形式参数) 宏体
宏体: 应包含形参 例如:#define AS(x,y,z) x+y+z
…… sum=AS(3,4,5); 功能: 预编译时用宏体代换宏名,同时用实参 代换形参。即用3+4+5代替AS(3,4,5)
带参数宏举例
#define MIN(a,b) a<b?a:b
main( )
{
float x,y,min;
scanf(“%f%f”,&x,&y); 经宏展开后为:
min=MIN(x,y);
min=x<y?x:y;
printf(“min=%f\n”,min);
}
带参数宏注意事项
说明: 1. 在宏名与带参数的括号之间不应加空格 2. 同一个宏名不能重复定义 3. 注意带参数的宏与函数不同
第7章 编译预处理
本章内容
1 宏定义 2 文件包含
编译预处理
编译预处理是 C语言编译系统的一个组成部分。C 编译系统对程序进行编译之前,先对程序中以 # 开头的特殊命令进行“预处理”,然后将预处理结 果和源程序一起进行编译处理,得到目标代码。
C语言提供的预处理功能主要有三种:宏定义、文 件包含、条件编译。不属于c语言语句,可出现在 程序的任何位置,有效范围从它们的出现点开始。
A. 函数在运行时处理,宏在编译时进行,不占运行时间 B. 函数中形参与实参要进行定义数据类型;宏不需要 C. 宏展开后可使程序变长;函数调用源程序长度不变
文件包含
文件包含的一般形式: #include “文件名” 或: #include <文件名>
功能:用指定文件的全部内容来替换该命令行,使之成 为源程序一部分。
不带参数宏注意事项
5. 宏定义允许嵌套。即在进行宏定义时,可以在宏体中 使用已定义的宏名,在预处理时进行层层替换。 例 #define R 3.0 #define PI 3.14159 #define S PI*R*R main( ) { printf(“%f\n”,S); }
}
不带参数宏注意事项
1. 宏名通常用大写字母表示,这并不是语法规定,只是为 了与变量名区别。
2. 宏定义不是c语句,不必在行末加 ;号。 3. 宏定义的位置通常放在程序的开头,作为文件的一部分
,其作用域为从宏定义位置开始到此文件结束。但可以 用 “#undef 宏名”命令终止宏定义的作用域,这样 可以灵活控制宏定义的作用范围。 4. 若用户标识符中的一部分与宏名相同,则在预处理时不 对其进行替换。例如:
宏定义
在C语言源程序中允许使用“宏”,即用一个指定的 标识符表示一个字符串。其中标识符称为“宏名”, 字符串称为“宏体”。在编译预处理时,对程序中所 有出现的“宏名”,都用宏体去替换,这个替换过程 称为“宏代换”或“宏展开”。
C语言中的宏定义分为: 不带参数的宏定义和带参数的宏定义
不带参数的宏
不带参数宏定义一般形式:
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;
printf(“r=%f, a=%f, s=%f \n”, r,a,s);
#define 宏名 宏体
宏名:由标识符定义 宏体: 为一字符串 例如: #define PI 3.1415926 功能: 编程时用宏名PI来代替“3.1415926”
这个字符串,在编译预处理时,把程 序中在该命令以后出现的PI用 3.1415926替换。
不带参数宏举例
#define PI 3.1415926
说明:
1. 一个 #include 命令只能指定一个包含文件。 2. 文件包含可以嵌套。 3. 当包含文件修改后,对包含该文件的源程序必须重新进
行编译连接处理。 4. #include “文件名”形式,系统先在引用被包含文件源
文件所在目录中寻找,找不到再按标准方式检索其他目 录; #include <文件名>方式不检查源文件所在目录, 直接按标准方式检索文件目录。
6. 同一个宏名不能重复定义。
wenku.baidu.com
带参数的宏
带参数的宏定义一般形式: #define 宏名(形式参数) 宏体
宏体: 应包含形参 例如:#define AS(x,y,z) x+y+z
…… sum=AS(3,4,5); 功能: 预编译时用宏体代换宏名,同时用实参 代换形参。即用3+4+5代替AS(3,4,5)
带参数宏举例
#define MIN(a,b) a<b?a:b
main( )
{
float x,y,min;
scanf(“%f%f”,&x,&y); 经宏展开后为:
min=MIN(x,y);
min=x<y?x:y;
printf(“min=%f\n”,min);
}
带参数宏注意事项
说明: 1. 在宏名与带参数的括号之间不应加空格 2. 同一个宏名不能重复定义 3. 注意带参数的宏与函数不同
第7章 编译预处理
本章内容
1 宏定义 2 文件包含
编译预处理
编译预处理是 C语言编译系统的一个组成部分。C 编译系统对程序进行编译之前,先对程序中以 # 开头的特殊命令进行“预处理”,然后将预处理结 果和源程序一起进行编译处理,得到目标代码。
C语言提供的预处理功能主要有三种:宏定义、文 件包含、条件编译。不属于c语言语句,可出现在 程序的任何位置,有效范围从它们的出现点开始。
A. 函数在运行时处理,宏在编译时进行,不占运行时间 B. 函数中形参与实参要进行定义数据类型;宏不需要 C. 宏展开后可使程序变长;函数调用源程序长度不变
文件包含
文件包含的一般形式: #include “文件名” 或: #include <文件名>
功能:用指定文件的全部内容来替换该命令行,使之成 为源程序一部分。