第8节 内联函数.pdf

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
下载 下载 第8章 内联 函 数 C + +继承C 的一个重要特性是效率。假如 C + + 的效率显著地比C低,程序设计者不会使用 它。 在C 中,保护效率的一个方法是使用宏( m a c r o ) 。宏可以不用普通函数调用就使之看起来像 函数调用。宏的实现是用预处理器而不是编译器。预处理器直接用宏代码代替宏调用,所以就 没有了参数压栈、生成汇编语言的 C A L L 、返回参数、执行汇编语言的 R E T U R N 的时间花费。 所有的工作由预处理器完成,因此,不用花费什么就具有了程序调用的便利和可读性。 C + + 中,使用预处理器宏存在两个问题。第一个问题在 C 中也存在:宏看起来像一个函数 调用,但并不总是这样。这就隐藏了难以发现的错误。第二个问题是 C + +特有的:预处理器不 容许存取私有( p r i v a t e )数据。这意味着预处理器宏在用作成员函数时变得非常无用。 为了既保持预处理器宏的效率又增加安全性,而且还能像一般成员函数一样可以在类里访 问自如,C + +用了内联函数(inline function) 。本章我们将研究C + +预处理器宏存在的问题、C + + 中如何用内联函数解决这些问题以及使用内联函数的方针。 8.1 预处理器的缺陷 预处理器宏存在的关键问题是我们可能认为预处理器的行为和编译器的行为一样。当然, 有意使宏在外观上和行为上与函数调用一样,因此容易被混淆。当微妙的差异出现时,问题就 出现了。 考虑下面这个简单例子: #define f (x) (x+1) 现在假如有一个像下面的f 的调用 f (1) 预处理器展开它,出现下面不希望的情况: (x) (x+1) (1) 出现这个问题是因为在宏定义中f和括号之间存在空格缝隙。当定义中的这个空格取消后, 实际上调用宏时可以有空格空隙。像下面的调用: f ( 1 ) 依然可以正确地展开为: (1 + 1) 上面的例子虽然微不足道但问题非常明显。在宏调用中使用表达式作为参数时,问题就出 现了。 存在两个问题。第一个问题是表达式在宏内展开,所以它们的优先级不同于我们所期望的 优先级。例如: #define floor(x,b) x=b?0:1 现在假如对参数使用表达式 第8章 内联 函 数 143 下载 if(floor(a0x0f,0x07)) // ... 宏将展开成: if(a0x0f=0x07?0:1) 因为 的优先级比 = 的低,所以宏的展开结果将会使我们惊讶。一旦发现这个问题,可以 通过在宏定义内使用括弧来解决。上面的定义可改写如下: #define floor(x,b) ((x)=(b)?0:1) 发现问题可能很难,我们可能一直认为宏的行为是正确的。在前面没有加括号的版本的例 子中,大多数表达式将正确工作,因为 = 的优先级比像+ 、/ 、- -甚至位移动操作符的优先级都 低。因此,很容易想到它对于所有的表达式都正确,包括那些位逻辑操作符。 前面的问题可以通过谨慎地编程来解决:在宏中将所有的内容都用括号括起来。第二个问 题则更加微妙。不像普通函数,每次在宏中使用一个参数,都对这个参数求值。只要宏仅用普 通变量调用,这个求值就开始了。但假如参数求值有副作用,那么结果可能出乎预料,并肯定 不能模仿函数行为。 例如,下面这个宏决定它的参数是否在一定范围: #define band(x) (((x)5 (x)10) ? (x) : 0) 只要使用一个“普通”参数,宏和真的函数工作得非常相像。但只要我们松懈并开始相信 它是一个真的函数时,问题就开始出现了。 下面是这个程序的输出,它完全不是我们想从真正的函数期望得到的结果: 144 C + +编程思想 下载 当a等于4 时,测试了条件表达式第一部分,但它不满足条件,而表达式只求值一次,所以 宏

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档