1、c++中的const常量可以替代巨集常數定義,如:
const int a = 3; #define a 3
2、c++中是否有解決方案替代巨集**片段呢?(替代巨集**片段就可以避免巨集的***!)
c++中推薦使用內聯函式替代巨集**片段
c++中使用inline關鍵字宣告內聯函式
說明1:
inline
必須和函式體的實現,寫在一塊
說明2
c++編譯器可以將乙個函式進行內聯編譯
被c++編譯器內聯編譯的函式叫做內聯函式
內聯函式在最終生成的**中是沒有定義的
c++編譯器直接將函式體插入在函式呼叫的地方
內聯函式沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)
說明3:
c++編譯器不一定准許函式的內聯請求!
說明4
內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等)
內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求
內聯函式由 編譯器處理,直接將編譯後的函式體插入呼叫的地方
巨集**片段 由預處理器處理, 進行簡單的文字替換,沒有任何編譯過程
說明5:
現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有inline宣告,也可能被編譯器內聯編譯
另外,一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強制內聯如:g++中的__attribute__((always_inline))屬性
說明6 (c++中內聯編譯的限制):
1)函式內聯宣告必須在呼叫語句之前 2
)不能存在任何形式的 迴圈語句、 函式取址操作 3
)不能存在過多的條件判斷語句 4
)函式體不能過於龐大 5)
編譯器對於內聯函式的限制並不是絕對的,內聯函式相對於普通函式的優勢只是省去了函式呼叫時壓棧,跳轉和返回的開銷。因此,當函式體的執行開銷遠大於壓棧,跳轉和返回所用的開銷時,那麼內聯將無意義。
結論
1)內聯函式在編譯時直接將函式體插入函式呼叫的地方
2)inline只是一種請求,編譯器不一定允許這種請求
3)內聯函式省去了普通函式呼叫時壓棧,跳轉和返回的開銷
#include "iostream"
using namespace std;
//短小精悍的函式適合定義成內聯函式
//inline必須和函式體的實現,寫在一塊
//單獨宣告inline void printa()是錯誤的
inline void printa()
void main01()
//inline和#define的區別
#define myfunc(a, b) ((a) < (b) ? (a) : (b))
inline int myfunc(int a, int b)
int main()
inline函式 C 內聯函式 inline
inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...
C 對C的擴充套件
1.c 會對函式返回值型別和引數個數進行檢測 c語言預設為返回值為int,引數個數不做檢查 2.c 在定義結構體變數時,關鍵字struct可以省略,結構體名不能省 3.在全域性中定義 int val g bss段 全是0 在全域性中 int val g 20 data c正確 2是賦值 c 錯誤 重...
C 對C的擴充套件
c 是c語言的加強,是一種更好的c語言 c 是以c語言為基礎的,並且完全相容c語言的特性 c語言 物件導向方 objective c c c 以c語言為基礎 物件導向支援 型別加強 函式加強 異常處理 標準格式 namespace namec中的命名空間 在c語言中只有乙個全域性作用域 c語言中所有...