????????inline 工具是 C++新增的特性。C 语言使用预处理器语句#define 来提供宏一一内联代码的原始实现。例如,下面是一个计算平方的宏:
????????#define SQUARE(X)? X*X
这并不是通过传递参数实现的,而是通过文本替换来实现的——X是“参教”的符号标记
?? ?a = SQUARE(5.0); 被替代为 a = 5.0*5.0;
?? ?b = SQUARE(4.5 + 7.5); 被替代为 b = 4.5+7.5* 4.5 +7.5;
?? ?d = SQUARE(c++); 被替代为 d = c++*c++;
上述示例只有第一个能正常工作。可以通过使用括号来进行改进:
?? ?
?? ?#define SQUARE_TRUE(X) ((X)*(X))
????????但仍然存在这样的问题,即宏不能按值传递。即使使用新的定义,SOUARE(C++)仍将C递增两次但是程序清单 8.1中的内联函数 square()计算c 的结果,传递它,以计算其平方值,然后将c 递增一次。
????????这里的目的不是演示如何编写C 宏,而是要指出,如果使用C语言的宏执行了类似函数的功能,应考虑将它们转换为C++内联函数。
演示源码:
// Len_inline.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
#define SQUARE(X) X*X
#define SQUARE_TRUE(X) ((X)*(X))
inline double square(double x)
{
return x * x;
}
int main()
{
double a0 = 13.0;
double a1 = SQUARE(5.0);
double a2 = SQUARE(4.5 + 7.5);
double a3 = SQUARE(a0++);
double b0 = 13.0;
double b1 = square(5.0);
double b2 = square(4.5 + 7.5);
double b3 = square(b0++);
double c0 = 13.0;
double c1 = SQUARE_TRUE(5.0);
double c2 = SQUARE_TRUE(4.5 + 7.5);
double c3 = SQUARE_TRUE(c0++);
cout << "a1 = " << a1 << ", \tb1 = " << b1 << ", \tc1 = " << c1 << endl;
cout << "a2 = " << a2 << ", \tb2 = " << b2 << ", \tc2 = " << c2 << endl;
cout << "a3 = " << a3 << ", \tb3 = " << b3 << ", \tc3 = " << c3 << endl;
cout << "a0 = " << a0 << ", \tb0 = " << b0 << ", \tc0 = " << c0 << endl;
}
执行结果:
注: 我们期望的是宏和内联达到一致的目的,但是因为没有加额外的括号,所以导致执行的结果并不是期望的结果。当改进后,计算的结果就能拿到我们期望的结果。