C 中使用巨集需要注意的規範

2021-08-02 15:49:08 字數 1353 閱讀 7198

如:

#define rectangle_area( a, b ) (a) * (b)

#define rectangle_area( a, b ) ((a) * (b))

主要原因就是由於巨集替換的時候只是簡單的字元替換, 如果我們不使用完備的括號, 那麼很有可能或造成結果和我們想要得到的表示式不同.

在某種程度上帶參的巨集定義與函式有幾分類似。但是必須注意它們的區別,正如下面**片段所示:

#define square( a ) ((a) * (a))  

int square(int a)

int nvalue1 = 10, nvalue2 = 10;

int nsquare1 = square(nvalue1++); // nsquare1=110, nvalue1=12

int nsquare2 = square(nvalue2++);// nsquare2=100, nvalue2=11

類似的定義,卻產生了不同的結果,究其原因還是巨集的字元替換問題。正如上面的示例一樣,兩處的a都被引數nvalue1++替換了,所以nvalue1自增操作也就被執行了兩回。

這就是巨集在展開時對其引數的多次取值替換所帶來的***。為了避免出現這樣的***,最簡單有效的方法就是保證巨集引數不發生變化,如下所示。

#define square( a ) ((a) * (a))  

int nvalue1 = 10;

int nsquare1 = square(nvalue1); // nsquare1=100

nvalue1++; // nvalue1=11

如果巨集定義包含多條表示式,一定要用大括號將其括起來。如果沒有這個大括號,巨集定義中的多條表示式很有可能只有第一句會被執行,正如下面的**片段:

#define clear_cube_value( l, w, h )\  

l = 0;\

w = 0;\

h = 0;

int i = 0;

for (i = 0; i < cube_acount; i++)

clear_cube_value( cubes[i].l, cubes[i].w, cubes[i].h );

簡單的字元替代,並不能保證多條表示式都會放入for迴圈的迴圈體內,因為沒有將它包圍在迴圈體內的大括號中。正確的做法應該是用大括號將多條表示式括起來,這樣就能保證多條表示式全部執行了,如下面的**片段所示:

#define clear_cube_value( l, w, h )\  

使用巨集需要注意的地方

ddk提供了大量的巨集。在使用這些巨集的時候,要注意一種錯誤的發生,這就是 側效 side effect 巨集一般由多行組成,如下面的形式,其中的 代表換行 define print msg kdprint n kdprint msg kdprint n 在c語言中規定,for或者if語句塊中的內容...

關於巨集需要注意的問題

關於巨集需要注意的問題 1 define巨集與函式之間的優劣 巨集的執行速度比函式快得多,函式需要呼叫 返回等操作。函式只能對特定的型別操作,而巨集是型別無關的,巨集還可以實現一些函式無法實現的操作。但巨集需要將所有 拷貝到呼叫程式中,增加了 長度。所以 巨集比較適合執行簡單的計算,如求2個值中的較...

sql server中使用組合索引需要注意的地方

一 使用組合索引需要注意的地方 1 索引應該建在選擇性高的字段上 鍵值唯一的記錄數 總記錄條數 選擇性越高索引的效果越好 價值越大,唯一索引的選擇性最高 2 組合索引中字段的順序,選擇性越高的字段排在最前面 如果把低選擇性的列放在最左端,可能會造成無法使用該索引的情況。3 where條件中包含兩個選...