マクロの欠陥

1036 ワード

cでは、効率を維持する方法の1つはマクロを使用することであり、マクロは通常の関数呼び出しの代価を必要とせずに関数呼び出しのように見えることができる.マクロの実装は、コンパイラではなくプリプロセッサを使用します.マクロの欠陥問題1:式はマクロ内で展開されるため、それらの優先度は所望の優先度とは異なる.例:
#define FLOOR(x,b) x>=b?0:1
if(FLOOR(a&0x0f,0x07))
     :
if(a&0x0f>=0x07?0:1)

&の優先度は>=より低いので,マクロの展開は我々が望む結果ではない.したがって、マクロを定義するときは、すべての内容にかっこを付ける必要があります.問題2:マクロと実際の関数呼び出しが異なる.マクロで定義すると、パラメータはマクロに代入されます.例:
#define BAND(x)   (((x)>5&&(x)<10)?(x):0)
void main(){
...... cout<<BAND(++a)<<endl; ......

呼び出しマクロは実際には、(((++a)>5&&(++a)<10)?(++a):0)直接++aの具体的な値をxに代入するのではない.