#ifdef EXPORT
for ( i = 0; i < MAX_MSXRSM; i++ )
#else
for ( i = 0; i < MAX_MSRSM; i++ )
#endif
正确:
头文件中:
#ifdef EXPORT
#define MAX_MS_RSM MAX_MSXRSM
#else
#define MAX_MS_RSM MAX_MSRSM
#endif
源文件中:
for( i = 0; i < MAX_MS_RSM; i++ )
<规则4> 使用宏定义表达式时,要使用完备的括号。
如下的宏定义表达式都存在一定的隐患。
#define REC_AREA(a, b) a * b
#define REC_AREA(a, b) (a * b)
#define REC_AREA(a, b) (a) * (b)
正确的定义为:
#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++ ) {
/* 无循环体 */ }
或
while( *s++ == *t++ )
{
}
<规则9> 结构中元素布局合理,一行只定义一个元素。
如下例子不符合规范,
typedef struct {
_UI left, top, right, bottom;
} RECT;
应书写称:
typedef struct
{
_UI left; /* 矩形左侧 x 坐标 */
_UI top;
_UI right;
_UI bottom;
} RECT;
<规则10> 枚举值从小到大顺序定义。
<规则11> 包含头文件时,使用撓喽月肪稊,不使用摼 月肪稊。
如下引用:
#include \:\\switch\\inc\\def.inc\
应改为:
#include \
或
#include \
<规则12> 不允许使用复杂的操作符组合等。
下面用法不好,
iMaxVal = ( (a > b ? a : b) > c ? (a > b ? a : b) : c );
应该为:
iTemp = ( a > b ? a : b);
iMaxVal = (iTemp > b ? iTemp : b);
不要把\、\操作符与其他如\、\等组合在一起形成复杂奇怪的表达式。如下的表达式那以理解。
*pStatPoi++ += 1;
*++pStatPoi += 1;
应分别改为:
*pStatPoi += 1;
pStatPoi++;