1 在C語言中使用宏可以提高程式效率,但宏容易出錯
在宏定義中,最好給變數打上括弧,否則容易出錯.
宏和普通函數是有區別的,普通函數是值傳遞或者地址傳遞,但宏是簡單地拷貝,特別參數是a++這種容易使a++多次執行
2 在宏裡,沒法表示類的作用範圍.所以類中不能使用宏.轉而使用內嵌函式
在類的聲明中直接寫上函數定義的預設是inline函數
內嵌函式和普通函數差不多,會受到編譯器的檢查參數列表和傳回值. 但在調用時可以直接將函數直接替換成函數體,減小調用開銷,
但是否內聯是編譯器決定的,即使明確寫上inline也可能不按內聯進行替換,下面兩種情況是明確不能內聯的:
1 函數體複雜,比如有迴圈就不能內聯,原因是複雜的函數體替換會削弱甚至不會帶來效能上的提高
2 顯示或隱式地取該函數地址,編譯器必須為函數體分配記憶體
3 向前引用
class F{public:int f() const { return g()+1; }int g() const {return 1;} }
C++規定: 只有在類聲明結束後,類中的內嵌函式才起作用
所以引用未聲明的內建函式是可以的
4 內聯無法取代宏的地方:
字串定義: 將任意標識符轉換成字串數組
#define F(s) cout<< #s << endl; s ;
標誌粘貼:
#define D1(x) int x##one; #define D2(x) int x##two;
head.h
#ifndef HEAD_H#define HEAD_H#define F(s) cout<< #s << endl; s ;#define D1(x) int x##one; #define D2(x) int x##two;class Forward{ public: int f() {return g() +1;} int g() {return 1;}};#endif
main.cpp
#include <string>#include <iostream>#include "head.h"using namespace std;int main(){ F(cout << "abc" << endl;); D1(num); D2(num); numone = 100; numtwo = 200; F(cout<<numone << ' ' << numtwo << endl;); Forward f1; cout << f1.f() << endl; cout << f1.g() << endl;}
zhao@ubuntu:~/c++work/cpp9$ ./a.out
cout << "abc" << endl;
abc
cout<<numone << ' ' << numtwo << endl;
100 200
2
1