在c中,保持效率的一个方法是使用宏,宏可以不要普通的函数调用代价就可使之看起来像函数调用。宏的实现是用预处理器而不是编译器。
宏的缺陷
问题一:
表达式在宏内展开,所以它们的优先级不同于所期望的优先级。例如:
#define FLOOR(x,b) x>=b?0:1
if(FLOOR(a&0x0f,0x07))
宏将展开成:
if(a&0x0f>=0x07?0:1)
因为&的优先级比>=的低,所以宏的展开不是我们期望的结果。因此在定义宏时所有内容应该加上括号。
问题二:
宏和实际函数调用不一样。用宏定义,参数都要代进宏中。举例:
#define BAND(x) (((x)>5&&(x)<10)?(x):0)
void main(){
......
cout<<BAND(++a)<<endl;
......
调用宏实际上是这样的:(((++a)>5&&(++a)<10)?(++a):0)
而不是直接将++a的具体值代入x.