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文件會導致編譯錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM