正确的定义为:
#define REC_AREA(a, b) ((a) * (b))
<规则5> 宏所定义的多条表达式应放在大括号内。
示例:下面的语句只有宏中的第一条表达式被执行。为了说明问题,for语句的书写稍不符规范。
#define INIT_RECT_VALUE( a, b ) \
a = 0 ; \
b = 0 ;
for ( index = 0 ; index < RECT_TOTAL_NUM ; index ++ )
INIT_RECT_VALUE( rect.a, rect.b ) ;
正确的用法应为:
#define INIT_RECT_VALUE( a, b ) \
{ \
a = 0 ; \
b = 0 ; \
}
for ( index = 0 ; index < RECT_TOTAL_NUM ; index ++ )
{
INIT_RECT_VALUE( rect[ index ].a, rect[ index ].b ) ;
}
<规则6> 宏定义不能隐藏重要的细节,避免有return,break等导致流程转向的语句。
如下例子是不规范的应用,其中隐藏了程序的执行流程。
#define FOR_ALL for(i = 0; i < SIZE; i++)
/* 数组 c 置0 */
FOR_ALL
{
c[i] = 0;
}
#define CLOSE_FILE { \
fclose(fp_local); \
fclose(fp_urban); \
return; \
}
<规则7> 使用宏时,不允许参数发生变化。
下面的例子隐藏了重要的细节,隐含了错误。
#define SQUARE ((x) * (x))
.
.
.
w = SQUARE(++value);
这个引用将被展开称:
w = ((++value) * (++value));
其中value累加了两次,与设计思想不符。正确的用法是:
w = SQUARE(x);
x++;
<规则8> 当if、while、for等语句的程序块为摽諗时,使用搟}敺拧_
while ( *s++ == *t++ ) ;
以上不符合规范,正确的书写方式为:
while( *s++ == *t++ )