C語言中如何定義函數式宏

來源:文萃谷 2.29W

導語:眾所周知,宏擴展是純粹的文本擴展,若定義不明確,就會導致結果錯誤,或者編譯錯誤,尤其是定義函數式宏時,下面有三條規則可以使我們避免出錯。具體有哪些呢?一起來學習下吧:

C語言中如何定義函數式宏

 規則1:宏體必須使用括號包起來,以便保護表達式中低優先級的操作符。

例:

#define square(x)x*x

調用如下:

1/square(n)

會被擴展為

1/n*n

這等價於(1/n)*n,而我們需要的是

1/(n*n)

  規則2:在宏定義內部,所有參數的出現都必須用括號括起來,以便保護實參中任何低優先級的'操作符不受宏擴展其他部分的影響。

同樣以square()為例,調用

square(n+1);

會被擴展為

n+1*n+1

但我們需要的是

(n+1)*(n+1)

 規則3:如果一個參數在擴展中出現了多次,並且實參是帶有副作用的表達式,則宏可能不能正確運行。

再以square()宏為例,調用

square(i++)

會被擴展為

i++*i++

這很顯然是未定義的

遵循規則1和規則2的正確square宏的定義應該是:

#define square(x) ( (x) * (x) )

熱門標籤