- 1、本文档共38页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
引子 8.1 宏定义 作用: 用标识符(称为“宏名” )PI来代替3.1415926,在编译预处理时,将程序中在该命令以后出现的所有的PI都用3.1415926代替(这一过程又称为“宏展开”)。 #define PI 3.1415926 main( ) { float l,s,r,v; printf(input radius:); scanf(%f,r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf(l=%10.4f\ns=%10.4f\nv=%10.4f\n,l,s,v); } 1)宏名一般习惯用大写字母表示。非强制规定,也可用小写字母; 2)宏展开只作简单的替换,不作正确性检查。如果词义或语义错误,只有在编译已被宏展开后的源程序时才会发现错误并报错。 例如: #define PI 3.14l59 把第二个“1”写成“l”。这样的错误只有在编译已被宏展开后的源程序时才会发现错误并报错; #define X a+2 main() {int a,b; scanf (“%d”,a); b=2*X+3*X; printf (“b=%d\n”,b);} 3)宏定义不是C语句,不必在行末加分号,如果加了分号,则会连同分号一起进行替换; 如:#define PI 3.1415926; area = PI*r*r; 在宏扩展后成为: area = 3.1415926;*r*r; 结果,在编译时出现语法错误。 #define PR printf(“%d\n”,a); main() { int a=2; PR } 4) 一个#define只能定义—个宏,且一行只能定义一个宏。若需要定义多个宏就要使用多个#define,并写在多行上。 5)宏定义时如果一行写不下,可用“\”续行。 6)宏名的有效范围为定义命令之后到本 源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。 7)可以用#undef命令终止宏定义的作用域。这样可以灵活控制宏定义的作用范围。 8)在进行宏定义时,可以引用已定义的宏名,可以层层置换。 9)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间; 10)对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不进行置换; 一般形式: #define 宏名(形式参数表) 替换文本 例如 #define S(a,b) a*b area=S(2,3); 其中S(2,3)相当与2*3. 置换方式 带参宏定义展开时,先把宏引用替换为替换文本,再将替换文本中出现的形参分别用实参代替。 类似之处: 在引用函数时也是在函数名后的括弧内写实参,也要求实参与形参的数目相等。 区别: (1) 定义方式不同。带参宏使用预处理命令#define定义,而函数使用函数定义。 (2) 参数性质不同。带参宏的参数表中的参数不必说明其类型,也不分配存储空间;而函数参数表中的参数需说明其类型并为其分配存储空间。 (3) 实现方式不同。宏展开是在编译时由预处理程序完成的,不占用运行时间;而函数调用是在程序运行时进行,需占用一定的运行时间。 (4) 参数传递不同。若实参为表达式,引用带参宏时只进行简单的字符替换,不计算实参表达式的值;而函数调用时,则先计算表达式的值,然后代入形参。 (5) 返回值不同。带参宏定义无返回值;而函数可有返回值。 8.2 条件编译 一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件下才进行编译,这就是“条件编译”。 作用:当指定的标识符已被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。其中#else部分可以没有。这里的“程序段”可以是语句组,也可以是命令行。 它的作用是当所指定的标识符未被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2。它只是第一行与第一种形式不同。这种形式与第一种形式的作用相反。 作用:当指定的表达式值为真时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。 不用条件编译命令而直接用if语句也能达到要求,用条件编译命令的好处在于:可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。当条件编译段比较多时,目标程序
文档评论(0)