巨集的副作用

2022-01-31 13:51:36 字數 926 閱讀 6519

巨集定義在實際使用中如果不稍加注意,如果表示式有***,就可能導致返回的結果跟預期不符。下面是幾種常見的問題:

#define multi(a,b) a * b

multi(1+2,3);// => 1 + 2 * 3

#define add(a,b) (a) + (b)

int c = add(1,2) * 3; //1 + 2 * 3

因此巨集的引數和返回值最好是用()擴起來

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

#define add(a,b) ((a) + (b))

#define max(a,b) ((a) > (b) ? (a) : (b))

int a = 3,b = 2;

int c = max(a++,b);

返回值預期是4(a++)實際上是5,a進行了兩次++運算。

所以一般使用巨集最好不要傳入自增自減。

#define hash(str, sz, rst)  \

do \

while (0)

這是乙個hash的巨集實現,其中定義了乙個臨時變數n,根據str計算n,然後對sz求模並把返回值賦給傳進來的rst.

這麼呼叫:

int n;

hash("hello",7,n);

不會達到改變n的效果,因為實際使用引數n和巨集內部的變數n同名。解決辦法是巨集內部變數使用一種不同風格的命名方式。

#define hash(str, sz, rst)  \

do \

while (0)

C C 巨集 巨集的作用 副作用

基礎 巨集是預處理指令 巨集的本質是簡單的字串替換,預處理時進行巨集替換 可在定義巨集時要求它接收引數,巨集替換時會代入引數 巨集的名字不允許過載 巨集預處理 沒有能力處理遞迴呼叫。作用 看一段math.h中的巨集定義 if defined use math defines defined math...

巨集的一些副作用

1 優先順序問題 1 傳入變數優先順序 define multi a,b a b multi 1 2,3 1 2 3 其實是想要 1 2 3 2 作為值返回時,類似1 define add a,b a b int c add a,b 3 a b 3 其實是想要 a b 3 所以,一般的規則是 巨集裡...

transform 的副作用

transform 想必大家都很熟悉,可以通過其轉換 translate 旋轉 rotate 縮放 scale 傾斜 skew 等屬性來對元素進行變換,不過這篇文章想 的不是這些內容,而是 transform 對元素布局 頁面渲染方面的影響。例如,你知道它會影響 fixed 元素的位置嗎?你有想過它...