巨集定義在實際使用中如果不稍加注意,如果表示式有***,就可能導致返回的結果跟預期不符。下面是幾種常見的問題:
#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 元素的位置嗎?你有想過它...