内联和宏的比较

首先来看一道面试题

写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一 个。另外当写下least=MIN(*p++,b)时会发生什么?

解答:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) MIN(*p++, b)会产生宏副作用。

剖析:这个面试题主要考察宏定义可以实现函数的功能。但是它终归不是函数,宏定义中括弧的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。

解析: *p++ 有可能会被执行两次,least=((*p++)<(b)?(*p++):(b)),如果?后执行了(*p++),那就执行了2次,否则执行一次。

而内联inline也具有和宏一样的作用。

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
using namespace std;
#define sum(a) ((a)+(a))
inline int sum1(int a)
{
        return a + a;
}
int main(void)
{
        int a = 0;
        int b = sum(++a);//(++a)+(++a) 1括号++a后a为1,2括号++a后a为2,2+2=4
        cout << a << endl;//2
        cout << b << endl;//4
        int c = 0;
        int d = sum1(++c);//函数特性
        cout << c << endl;//1
        cout << d << endl;//2
        while (true);
        return 0;
}
作用:内联函数和宏,都是 通过代码替换 ,两者较普通函数而言,效率更高, 减少了函数调用的开销
区别:对比宏,内联函数多了语法检测和函数特性。

猜你喜欢

转载自blog.csdn.net/qq_39478139/article/details/106905424