36.内联函数和宏定义的区别
36.内联函数和宏定义的区别
■在使用时,宏只做简单字符串替换(编译前)。内联函数在编译时直接将函数代码嵌入到目标代码中,可以进行参数类型检查(编译时),语法判断等功能,且具有返回值,可以实现重载。
■宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误,宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义。
■ C++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类的成员函数。
内联函数适用场景:
- 使用宏定义的地方都可以使用 inline 函数。
- 作为类成员接口函数来读写类的私有成员或者保护成员,会提高效率。
预处理宏的缺陷
预处理器宏存在问题的关键是我们可能认为预处理器的行为和编译器的行为是一样的。当然也是由于宏函数调用和函数调用在外表看起来是一样的,因为也容易被混淆。但是其中也会有一些微妙的问题出现:
问题一:
#define ADD(x,y) x+y
inline int Add(int x,int y)
{
return x + y;
}
void test()
{
int ret1 = ADD(10, 20) * 10; //希望的结果是300
int ret2 = Add(10, 20) * 10; //希望结果也是300
cout << "ret1:" << ret1 << endl; //210
cout << "ret2:" << ret2 << endl; //300
}
问题二:
#define COMPARE(x,y) ((x) < (y) ? (x) : (y))
int Compare(int x,int y)
{
return x < y ? x : y;
}
void test02()
{
int a = 1;
int b = 3;
//cout << "COMPARE(++a, b):" << COMPARE(++a, b) << endl; // 3
cout << "Compare(int x,int y):" << Compare(++a, b) << endl; //2
}
问题三:
预定义宏函数没有作用域概念,无法作为一个类的成员函数,也就是说预定义宏没有办法表示类的范围。
参考资料来源:
阿秀