1. 程式人生 > >【C++】C++行內函數也可以用來代替巨集

【C++】C++行內函數也可以用來代替巨集

巨集是可以帶引數的,它在形式上和函式非常相似。不過不像函式,巨集僅僅是字串替換,不是按值傳遞,所以在編寫巨集時要特別注意,一不小心可能就會踩坑。

#define SQ(y) y*y

當n = 9 時,SQ(n) = 81

如果把SQ(n)換成SQ(n+1)卻得不到100,因為sq = n+1*n+1;

如果希望得到正確的結果,應該將巨集定義改為如下的形式:

#define SQ(y) (y)*(y)

要想得到正確的結果,還應該對巨集加以限制,在兩邊增加( ),如下所示:

#define SQ(y) ( (y)*(y) )

發生函式呼叫時,編譯器會先對實參進行計算,再將計算的結果傳遞給形參,並且函式執行完畢後會得到一個值,而不是得到一個表示式,這和簡單的字串替換相比省去了很多麻煩,所以在編寫C++程式碼時我推薦使用行內函數來替換帶引數的巨集。

和巨集一樣,行內函數可以定義在標頭檔案中(不用加 static 關鍵字),並且標頭檔案被多次#include後也不會引發重複定義錯誤。這一點和非行內函數不同,非行內函數是禁止定義在標頭檔案中的,它所在的標頭檔案被多次#include後會引發重複定義錯誤。這一點非常好啊!!!!