当前位置:文档之家› c语言编译预处理

c语言编译预处理

printf("maxi=%dmaxf=%f",n1>n2?n1:n2, f1>f2?f1:f2);
9.2
“文件包含”处理 文件包含” 文件包含
“文件包含“:是指一个源文件可以将另外一个 文件包含“ 是指一个源文件可以将另外一个 文件包含 源文件的全部内容包含进来。 包含进来 源文件的全部内容包含进来。 一般形式为: 一般形式为: #include “文件名” 或 文件名” 文件名 #include <文件名 文件名> 文件名
注意: 宏替换后,程序的原意表达。 注意: 宏替换后,程序的原意表达。
#define PF(x) x*x /*#define PF(x) (x)*(x) */ /*#define PF(x) ((x)*(x)) */ main() 注意替换时不求值, 注意替换时不求值, { 只是字符串的原样替换 int a=2, b=3, c; c=PF(a+b)/PF(a+1); printf("\nc=%d ",c); }
包含文件的查找方法: 包含文件的查找方法: #include “文件名” 文件名” 文件名 先在当前工作目录中去查找,若找不到 再到指定的标准目录中去查找。 如:对Turbo C编译系统,先在用户目录下 查找,然后在TC\include文件夹中查找。 #include <文件名 文件名> 文件名 直接到系统指定的标准目录中去查找。 如:对Turbo C编译系统,直接在TC\include 文件夹中查找。
形式二: 形式二: # ifdef 标识符 程序段1 程序段 #endif 形式三: 形式三: # ifndef 标识符 程序段1 程序段 # else 程序段2 程序段 #endif
作用:当所指定的标识 符已经被#define 命令定 义过,则在程序编译阶 段只编译程序段1,
作用:当所指定的标识 符未被#define 命令定义 过,则在程序编译阶段 只编译程序段1,否则编 译程序段2。
注意: 注意:
⑴宏名一般习惯用大写字母; 宏名一般习惯用大写字母; 大写字母 宏名用做代替一个字符串,不作语法检查; 代替一个字符串 ⑵宏名用做代替一个字符串,不作语法检查; ⑶宏定义无需“;” 宏定义无需“ 无需 宏定义的有效范围 从定义之处到 有效范围为 从定义之处到: ⑷宏定义的有效范围为,从定义之处到 •#undef命令终止 命令终止 #undef 标识符 若无#undef命令,则有效范围到本文结束; 命令, 本文结束; 若无 命令 则有效范围到本文结束 位置: ⑸ •若无 位置 •允许出现在程序中函数外的任意位置 允许出现在程序中函数外的 允许出现在程序中函数外 任意位置 •但一般情况下它总写在文件的开头。 但一般情况下它总写在文件的开头 但一般情况下它总写在文件的开头。 在进行宏定义时,可以引用已定义的宏名; ⑹在进行宏定义时,可以引用已定义的宏名;例
• 宏替换 宏展开) :用宏内容(字符串)原样替换 宏替换(宏展开 用宏内容(字符串) 宏展开 程序中的所有宏名字的过程。 程序中的所有宏名字的过程。
二、带参数的宏定义及宏替换
#define 宏名(宏形参数表) 宏名(宏形参数表) 字符串
作用: 宏替换时以实参数替代形参数。 作用: 宏替换时以实参数替代形参数。 #define PI 3.1415926 #define S(r) PI*r*r main( ) { 替换 float r1=3.6, area; 用PI*r1*r1替换 area= S(r1); printf("r=%f area=%f\n",r1,area); }
按第一种宏定义: 按第一种宏定义:c=a+b*a+b/a+1*a+1; ; 按第二种宏定义: 按第二种宏定义:c=(a+b)*(a+b)/(a+1)*(a+1); ; 按第三种宏定义: 按第三种宏定义:c=((a+b)*(a+b))/((a+1)*(a+1)); ;
*三、带参数的宏替换与函数的主要区别
二、使用常量表达式的值作为编译条件
形式: 形式: # if 表达式 程序段1 程序段 # else 程序段2 程序段 #endif 作用:当所指定的表达 式为真(非零)时就编 译程序段1,否则编译程 序段2。
可以事先给定一定条件, 可以事先给定一定条件,使程序在不 同的条件下执行不同的功能。 同的条件下执行不同的功能。
⑴函数调用时,先求出实参的值,然后代入形参。 而使用带参的宏只是进行简单的字符替换。 ⑵函数调用是在程序运行时处理的,而宏替换则是 在编译时进行的。 ⑶宏替换不占运行时间,只占编译时间,而函数调 用则占运行时间。 ⑷函数中函数名及参数均有一定的数据类型,而宏 不存在类型问题,宏名及其参数无类型。
程序举例: 程序举例:
程序举例: 程序举例:用同一程序实现大小写字母转换 若定义UP转换为大写 转换为大写) (若定义 转换为大写)
Байду номын сангаас#include
"stdio.h" #define UP main() { char s[128]; gets(s); #ifdef UP strupr(s); #else strlwr(s); #endif puts(s); }
#define MAX(x,y) x>y?x:y main( ) { int n1,n2; float f1,f2; scanf("%d%d%f%f",&n1,&n2,&f1,&f2);
printf("maxi=%dmaxf=%f",MAX(n1,n2),MAX(f1,f2) );
}
经预编译宏替换后的printf语句如下: 语句如下: 经预编译宏替换后的 语句如下
采用条件编译,可以减少被编译的语句, 采用条件编译,可以减少被编译的语句,从 而减少目标程序的长度,减少运行时间。 而减少目标程序的长度,减少运行时间。
#define PI 3.1415926 #define R 3.0 #define L 2*PI*R #define S PI*R*R main( ) { printf("l=%f \ns=%f\n",L,S); } 第一次替换: 第一次替换:printf("l=%f \ns=%f\n", 2*PI*R, PI*R*R); 二:printf("l=%f \ns=%f\n", 2*3.1415926*3.0, 3.1415926*3.0*3.0);
第8章 章
预处理命令
1 .掌握编译预处理的概念和特点 掌握编译预处理的概念和特点; 掌握编译预处理的概念和特点 2.掌握不带参数的宏定义及其使用, 掌握不带参数的宏定义及其使用, 掌握不带参数的宏定义及其使用 了解带参数的宏定义及其使用。 了解带参数的宏定义及其使用。 3.掌握“文件包含”的概念和使用; 掌握“文件包含”的概念和使用 掌握 4.了解条件编译的作用和形式。 了解条件编译的作用和形式。 了解条件编译的作用和形式
例1: #ifdef TURBO : #define int int #else #define int short #endif 例2: :
可用于实现程序 在不同环境下的 兼容性。
可用于进行程序 #ifdef DEBUG 的调试。 printf(“x=%d,y=%d\n”,x,y); #endif 调试过程中,在程序前面加#define DEBUG 调试完成后,将前面的#define DEBUG删除掉
8.2
宏定义
是对正文进行代入或嵌入的一种功能。 宏:是对正文进行代入或嵌入的一种功能。
一、不带参数的宏定义及宏替换
1.一般形式: 1.一般形式: 一般形式 #define 标识符 宏名 字符串 无分号 宏内容 作用: 用标识符来代表一个字符串。 作用: 用标识符来代表一个字符串。
引例:
#define PI 3.1415926 main() { float l,s,r,v; printf(“请输入半径 :”); 请输入半径 scanf(“%f”,&r); l=2.0*PI*r; s=PI*r*r; v=3.0/4*PI*r*r*r; printf(“l=%f s=%f v=%f\n”,l,s,v); }
8.1 编译预处理命令
一、编译预处理的概念
C语言允许在程序中使用几种特殊的命令,在C编译 系统对程序进行通常的编译之前,先对程序中这些特殊 命令进行“预处理”,然后将预处理的结果和源程序一 起再进行通常的编译处理,以得到目标代码。
二、主要预处理功能 文件包含; ⑴宏定义 ; ⑵文件包含; ⑶条件编译
9.3 条件编译 条件编译:根据条件选择被编译的源程序行。 条件编译:根据条件选择被编译的源程序行。
•使用宏定义的标识符作为编译条件 •使用常量表达式的值作为编译条件
一、使用宏定义的标识符作为编译条件
形式一: 形式一: # ifdef 标识符 程序段1 程序段 # else 程序段2 程序段 #endif 作用:当所指定的标识符已经被#define 命令定义 过,则在程序编译阶段只编译程序段1,否则编译 程序段2。
相关主题