C/C++ 内联inline与宏define

        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 
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;
}

执行结果:

C/C++ 内联inline与宏define_第1张图片

注: 我们期望的是宏和内联达到一致的目的,但是因为没有加额外的括号,所以导致执行的结果并不是期望的结果。当改进后,计算的结果就能拿到我们期望的结果。

你可能感兴趣的:(C/C++学习,c语言,c++,开发语言)