zoukankan      html  css  js  c++  java
  • inline和宏之间的区别

    1、内联函数在编译时展开,而宏在预编译时展开

    2、在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。

    3、内联函数可以进行诸如类型安全检查、语句是否正确等编译功能,宏不具有这样的功能。

    4、宏不是函数,而inline是函数

    5、宏在定义时要小心处理宏参数,一般用括号括起来,否则容易出现二义性。而内联函数不会出现二义性。

    6、inline可以不展开,宏一定要展开。因为inline指示对编译器来说,只是一个建议,编译器可以选择忽略该建议,不对该函数进行展开。

    7、宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。

    如何使用类的inline函数:

      简单提一下inline 的使用吧:

      1.在类中定义这种函数:

      class ClassName{

      .....

      ....

      INT GetWidth(){return m_lPicWidth;}; // 如果在类中直接定义,不需要用inline修饰,编译器自动化为内联函数

      .... //此说法在《C++ Primer》中提及

      ....

      }

      2.在类外定义前加inline关键字:

      class Account {

      public:

      Account(double initial_balance) { balance = initial_balance; } //与1相同

      double GetBalance(); //在类中声明

      double Deposit( double Amount );

      double Withdraw( double Amount );

      private:

      double balance;

      };

      inline double Account::GetBalance() { return balance; } //在类外定义时添加inline关键字

      inline double Account::Deposit( double Amount ) { return ( balance += Amount ); }

      inline double Account::Withdraw( double Amount ) { return ( balance -= Amount ); }

      此外含有一些规则需注意:

      1、inline说明对对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如,你将一个长达1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。

      2、在调用内联函数时,要保证内联函数的定义让编译器""到,也就是说内联函数的定义要在头文件中,这与通常的函数定义不一样。但如果你习惯将函数定义放在CPP文件中,或者想让头文件更简洁一点,可这样做:

      //SomeInline.h中

      #ifndef SOMEINLINE_H

      #define SOMEINLINE_H

      inline Type Example(void);

      //........其他函数的声明

      #include“SomeInlie.cpp” //源文件后缀名随编译器而定

      #endif

      //SomeInline.cpp中

      #include"SomeInline.h"

      Type Example(void)

      {

      //..........

      }

      //...............其他函数的定义

      以上方法是通用、有效的,可放心使用,不必担心在头文件包含CPP文件会导致编译错误。

  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/zmlctt/p/3986828.html
Copyright © 2011-2022 走看看