即保持預處理宏的效率又增加安全性,而且還能像一般成員函數一樣在內里面訪問自如--內聯函數。
宏的優點:減少了調用函數的開銷。缺點:像一個函數,但是有時會帶來副作用,不能訪問類成員。
內聯函數:類里面的宏,但是會被編譯器檢查參數和返回值。同樣不需要函數調用的開銷。
應該把內聯函數寫在頭文件中。當編譯器看到這個定義時,它把函數類型(函數名+返回值)和函數體都放到符號表中。當使用函數時,編譯器檢查以確保調用時正確的,且返回值被正確使用,最后將函數調用替換為函數體。在函數定義前寫上inline.
內聯函數很特殊,在每個用到該函數的文件中,不會出現多個定義錯誤的情況。
有時候創建的類成員函數都是內聯函數的時候,可以把整個類放在頭文件中。
當內聯函數遇到編譯器
對于任意函數,編譯器在它的符號表中放入函數類型(函數原型,參數,返回值)。
1. 裝入符號表:當編譯器看到內聯函數然后對內聯函數體分析沒有發現錯誤之后,就將函數體也放入符號表。
2. 替換函數:當調用時,編譯器先確保調用確,即所有參數類型必須滿足,假如函數類型信息符合調用上下文(返回值也被合理利用),內聯函數代碼就會直接替換函數調用。
兩種情況不能執行內聯:
1. 函數太復雜。
2. 取函數地址。
向前引用:
class Forward
{
int i;
public:
Forward():i(0){}
int f() const { return g() + 1;}// right
int g() const { return i;}
};
c++語言規定,只有在類聲明結束后,內聯函數才會被計算。所以,不用擔心沒有聲明就被調用的情況。
字符串定義和粘貼
#define TRACE(s) cerr << #s << endl; s
for(int i = 0; i <100 ; i++)
TRACE(f(i));// cerr << "f(0)" <<endl; f(0);
#define FIELD(a) char* a##_STRING; int a##_size
FIELD(one);
//char* one_string;
//int one_size;
1
posted on 2012-05-30 16:45
Dino-Tech 閱讀(244)
評論(0) 編輯 收藏 引用