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