传智播客旗下技术交流社区北京校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

C/C++中的内联函数与宏定义
今天为大家分享在c/c++中关于内联函数与宏定义总结,如果能把本文章彻底理解,相信大家对内联函数的认识会上一个新的台阶。
Let’s  begin!!!!
c++从c中继承的一个重要特征就是效率。假如c++的效率明显低于c的效率,那么就会有很大的一批程序员不去使用c++了。
在c中我们经常把一些短并且执行频繁的计算写成宏,而不是函数,这样做的理由是为了执行效率,宏可以避免函数调用的开销,这些都由预处理来完成。
但是在c++出现之后,使用预处理宏会出现两个问题:
n  第一个在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误。
n  第二个问题是c++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类类的成员函数。
为了保持预处理宏的效率又增加安全性,而且还能像一般成员函数那样可以在类里访问自如,c++引入了内联函数(inline function).
内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为成员函数。
内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议,如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。一个好的编译器将会内联小的、简单的函数。
预处理宏的缺陷
预处理器宏存在问题的关键是我们可能认为预处理器的行为和编译器的行为是一样的。当然也是由于宏函数调用和函数调用在外表看起来是一样的,因为也容易被混淆。但是其中也会有一些微妙的问题出现:
问题一:
  
#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
  
}
  
问题三:
预定义宏函数没有作用域概念,无法作为一个类的成员函数,也就是说预定义宏没有办法表示类的范围。
好的今天的分享先到这里,我们为您的分享只是刚刚开始,如果大家对学习c/c++还有什么问题可以关注黑马程序员了解更多的学习技巧和免费的教学视频。
我们的目标是让大家开心的学习,高薪的就业。

分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马
关闭

站长推荐 上一条 /4 下一条