宏与内联函数

一、宏函数
1.不带参数的宏定义:
(1)格式:#define 标识符 字符串
(2)其中标识符就是符号常量,也成为“宏名”。预处理(预编译)阶段也叫做宏展开,将宏名替换成字符串。

#define PI 3.1415926  //把程序中出现的PI全部替换成3.1415926

2.带参数的宏定义(宏函数):
(1)除了一般的字符串替换,还要做参数代换。
(2)格式:#define 宏名(参数表) 字符串

#define S(a,b) a*b

在代码中执行语句:

mul = S(2,3);//第一步被替换为mul = a*b;第二步替换为mul = 2*3;类似于函数调用

3.注意问题:
(1)实参如果是表达式容易出问题:
#define S(r) r*r
执行如下代码:

mul = S(a+b);//第一步被替换为mul = r*r;,第二步被替换为mul = a+b*a+b;

这样就不满足我们的本意了,正确的宏定义是:

#define S(r) ((r)*(r))

(2)宏替换只做替换,不做计算,不做表达式求解。
(3)函数调用再编译后程序运行时进行,并且分配内存,宏替换在编译前进行,不分配内存。
(4)宏替换没有类型的检测,也没有类型转换。
(5)函数只有一个返回值,宏可以有多个值返回。
(6)宏在预编译阶段展开使源程序变得冗长,函数调用不会。
(7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。
4.宏的优缺点:
(1)优点:

  • 提高程序运行速度。

  • 提高代码可读性。
    (2)缺点:

  • 不会进行类型检测,程序不安全。

  • 造成代码膨胀。

  • 有副作用(++/–)。

  • 不能调试。
    二、内联函数
    1.概念:
    以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的速度。
    2.特性:
    (1)inline是有一种空间换时间的做法,省去调用函数的额外开销,所以代码很长或者有循环、递归的函数不适宜使用内联。
    (2)inline对于编译器只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环、递归等等,编译器优化时会自动忽略掉内联。
    (3)inline必须与函数定义放在一起,才能成为内联函数,仅将inline放在函数声明前是不起作用的,定义在类内的成员函数默认定义为内联函数。
    三、内联函数与宏函数的区别与联系
    1.它们可以提高代码的运行速度。
    2.内联函数在编译时展开,宏在预编译时展开。
    3.内联函数直接嵌入到目标代码中,宏是简单的做文本替换。
    4.内联函数有类型检测、语法判断等功能,而宏没有。
    5.inline函数是函数,相对于宏比较好调试,宏调试比较麻烦。
    6.宏不能访问对象的私有成员,但是定义在类内的内联函数可以访问。
    7.宏定义时要注意书写(参数要括起来)否则容易出现歧义。内联函数不会造成歧义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值