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

执行结果:

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

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WendyWJGu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值