- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章宏定义
* 第七章 编译预处理与变量的存储类型 * 第六章 数 组 第七章 编译预处理与变量的存储类型 7.1 宏定义 7.2 变量的存储类型 如前所述,一个高级语言源程序要在计算机上运行,必须先用编译程序进行编译(词法分析、语法分析、代码生成)生成目标文件,而后才可运行。但有时需要在编译之前进行某些“预处理”工作,如去掉注释、变换格式等。为此,C语言允许在源程序中使用以“#”号开头且末尾不加分号的语句,进行预处理工作。从语法上讲,它不同于C语言的一般语句,因而被称为预处理命令。C语言中的预处理命令有以下几种: (1)宏定义 (2)文件包含 (3)条件编译 第七章 编译预处理与变量的存储类型 7.1 宏定义 以#define作为标志的编译预处理命令称为宏定义命令。 7.1.1 不带参数的宏定义 不带参数的宏就是用指定的名字(标识符)来代表一个字符串,其格式为: #define 标识符 字符串 如:#define PI 3.1415926 其中的标识符又叫宏名,宏名一般由大写字母组成。字符串又叫宏体。#define、标识符、字符串三者之间用空格分隔。每条预处理命名占一行,末尾不加分号。#define命令一般出现在文件的开头,其有效作用域从它出现起到本源文件结束为止。可以用#define命令终止宏定义的作用域。 实际中,系统对宏的处理是这样的:当遇到宏名时,就用宏体替换,即所谓的宏替换。这一过程是由预编译程序完成的(不必用户自己操作),而后才将宏替换后的程序交编译程序进行编译。 【例7.1】求圆周长。 #define PI 3.1415926 double yuan_zchang(double radius) { return(2 ? PI ? radius); } 经宏替换后为 double yuan_zchang(double radius) { return(2 ? 3.1415926 ? radius); } 7.1 宏定义 使用宏的目的主要有两个: (1)提高程序的可读性 在程序中使用到的常数往往都有一定的物理含义,但我们很难从数字本身看出它的含义。有了宏问题就解决了。 如: #define TRUE 1 #define FALSE 0 这样在源程序中就可以使用标识符TRUE和FALSE来表示逻辑真与假。 (2)易于程序的修改 在程序中使用到的某一常数往往在多处出现,如要对它修改,需修改多处且需排除形式相同含义不同的量。 7.1 宏定义 使用宏时还应注意以下问题: (1)在预编译时的,宏替换只是简单地用宏体(字符串)去替代宏名而不进行语法和语义的检查。如下边的宏定义,在预编译时也是正确的,只是在以后的编译中才报告出错。 #define PI 3.14L5926 (2)如果在双引号中出现与宏名相同的字符,则这个字符不被替换。 【例7.2】 #define WELCOME hello void main() { printf(WELCOME\n); printf(WELCOME); } 7.1 宏定义 7.1.2 带参的宏 带参的宏的一般形式为: #define 宏名(参数表) 字符串 其中的字符串包含有定义时的参数。如: #define area(r) (3.1415926?(r)?(r)) 定义了带参的宏,就可以在程序中使用了。使用时与不带参的宏基本相同,所不同的是,在宏替换时要用实参置换宏体中的形参,其他字符不变。 7.1 宏定义 【例7.3】 #define area(r) (3.1415926?(r)?(r)) void main() { printf(%f ,area(3)); } 被替换成: void main() { printf(%f ,3.1415926?3?3); } 7.1 宏定义 使用带参的宏应注意以下几点: l???带参的宏定义中,宏名与带参数的圆括号之间不能有空格。如: #define area (r) (3.1415926?(r)?(r)) 系统会认为这是一个不带参的宏,宏名为area,宏体为(r) (3.1415926?(r)?(r))。 l???????? 整个宏体及其中所含形参要用括号括起(也就是说,括号不是宏体的一部分),否则就会出错。如: #define square(x) x?x 遇到
文档评论(0)