★第07章 编译预处理
时间:2026-01-14
时间:2026-01-14
第7章
编译预处理和程序的多文件组织
编译预处理命令:以#开头,以回车结 编译预处理命令: 开头, 独占一行; 束,独占一行;可出现在程序中的任 7.1 宏定义 何位置,常置于源程序的开始; 何位置,常置于源程序的开始;不属 7.2 文件包含 C++的语法范畴 的语法范畴。 于C++的语法范畴。 7.3 条件编译 常用编译预处理命令:宏、文件包含 常用编译预处理命令: 7.4 程序的多 和条件编译。 和条件编译。 文件组织 编译预处理:编译源程序前,先用预 编译预处理:编译源程序前, 处理程序处理源程序中的编译预处理 作业: 作业:4/7/8 命令, 命令,并过滤源程序中的注释和多余 空白符,生成一个完全用C++ C++语言表达 空白符,生成一个完全用C++语言表达 的临时源程序文件供编译系统处理。 的临时源程序文件供编译系统处理。
7.1 宏定义 宏定义:用预处理命令#define实现。 宏定义:用预处理命令#define实现 实现。 宏定义分为: 宏定义分为: 带参数的宏定义; ⑴带参数的宏定义; 不带参数的宏定义。 ⑵不带参数的宏定义。
7.1.1 不带参数的宏定义 格式: 格式: #define 标识符 字符或字符串 其中,标识符称为宏名。 其中,标识符称为宏名。 举例: 举例: #define PI 3.1415926 其作用是将宏名PI定义为字符串3.1415926 PI定义为字符串3.1415926。 其作用是将宏名PI定义为字符串3.1415926。在编译 预处理时,将该命令后所有出现PI处均用3.1415926 PI处均用3.1415926替 预处理时,将该命令后所有出现PI处均用3.1415926替 这种替换称为“宏替换” 宏扩展” 换。这种替换称为“宏替换”或“宏扩展”或“宏展 开”。 宏替换的本质是字符串替换。 宏替换的本质是字符串替换。 又如: 又如: 面积为:" #define PROMPT "面积为:"
例7.2 宏定义的使用。 宏定义的使用。 #include<iostream.h> #define PI 3.1415926 #define R 2.8 #define AREA PI*R*R //A "面积 面积= #define PROMPT "面积=" void main(void) cout<<PROMPT<<AREA<<'\ { cout<<PROMPT<<AREA<<'\n'; } 程序运行结果: 程序运行结果: 面积= 面积=24.6301
不带参宏说明⑴通常宏名用大写字母表示,以别于变量名。当然,从 通常宏名用大写字母表示,以别于变量名。当然, 语法上来讲,任一合法的标识符均可用作宏名。 语法上来讲,任一合法的标识符均可用作宏名。 宏定义可出现在程序中的任何位置, ⑵宏定义可出现在程序中的任何位置,但通常放在源程 序文件的开始。 序文件的开始。宏名的作用域从宏定义开始到本源程 序文件结束。 序文件结束。 在宏定义中可用已定义的宏名。如例7.2中的A 7.2中的 ⑶在宏定义中
可用已定义的宏名。如例7.2中的A行,在 宏定义AREA AREA时 用到已定义的宏名PI PI和 宏定义AREA时,用到已定义的宏名PI和R。在编译预处 理时,先对该行中的PI PI和 作替换。替换后, 行为: 理时,先对该行中的PI和R作替换。替换后,A行为: #define AREA 3.1415926*2.8*2.8
⑷宏扩展时,只对宏名作字符串代换,不作任何计算, 宏扩展时,只对宏名作字符串代换,不作任何计算, 也不作任何语法检查。若宏定义时书写不正确, 也不作任何语法检查。若宏定义时书写不正确,会得 到不正确的结果或编译时出现语法错误。 到不正确的结果或编译时出现语法错误。如: #define A 3+5 #define B A*A cout<<B<<'\ cout<<B<<'\n'; //C 行输出为23 而不是64 23, 64。 行宏扩展后为: C行输出为23,而不是64。因C行宏扩展后为: cout<<3+5*3+5<<'\ cout<<3+5*3+5<<'\n'; 若要终止宏名的作用域,可用预处理命令: ⑸若要终止宏名的作用域,可用预处理命令: #undef 宏名 例如: 例如: #define PI 3.1415926 … //终止PI的作用域 其后不能再用PI 终止PI的作用域, #undef PI //终止PI的作用域,其后不能再用PI
⑹当宏名出现在字符串中时,编译预处理不做宏扩展。 当宏名出现在字符串中时,编译预处理不做宏扩展。 7.3宏名出现在字符串中时的编译预处理 宏名出现在字符串中时的编译预处理。 例7.3宏名出现在字符串中时的编译预处理。 #include<iostream.h> "欢迎 欢迎" #define A "欢迎" "A参观展览会 参观展览会" #define B "A参观展览会" void main(void) cout<<B<<"! { cout<<B<<"!\n"; } 程序运行结果: 程序运行结果: 参观展览会! A参观展览会! 在同一个作用域内,同一个宏名不允许重复定义。 ⑺在同一个作用域内,同一个宏名不允许重复定义。
7.1.2 带参数的宏定义 带参数宏定义的形式: 带参数宏定义的形式: 宏名(参数表) #define 宏名(参数表) 使用参数的字符或字符串 带参宏定义在宏扩展时,要对宏名和参数做替换。 带参宏定义在宏扩展时,要对宏名和参数做替换。 带参数宏举例: 带参数宏举例: 宏定义中的参数称为形参。 宏定义中的参数称为形参。 例如:宏AREA有参数a和b。 例如: AREA有参数 有参数a
#define AREA(a,b) a*b 带参宏扩展:先用实参替代宏 带参宏扩展: b=AREA(2.0,7.8); 定义中的形参, 定义中的形参,并将替代后的字符串替代宏调用。 字符串替代宏调用。宏扩展仅 作字符串替代,不作计算。 作字符串替代,不作计算。 举例:宏调用经宏扩 …… 此处隐藏:4836字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:土木工程毕业设计文献综述
下一篇:窃读记教案设计