宏定义展开的区别
#define FILE_OAD_NUM_LEN 2
#define FILE_PER_OAD_FIX_DAT_LEN 512 //每个OAD的固定长度
//如下两种方式定义,展开之后计算的值正确
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM) (FILE_OAD_NUM_LEN + FILE_PER_OAD_FIX_DAT_LEN*OAD_NUM)
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM) (FILE_PER_OAD_FIX_DAT_LEN*OAD_NUM + FILE_OAD_NUM_LEN)
//如下两种方式定义,展开之后计算的值不正确
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM) (OAD_NUM*FILE_PER_OAD_FIX_DAT_LEN + FILE_OAD_NUM_LEN)
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM) (FILE_OAD_NUM_LEN + OAD_NUM*FILE_PER_OAD_FIX_DAT_LEN)
其实上面的写法本身没有问题,只是我在调试的时候,发现调整前后顺序结果就不一样,以为是这个问题导致,其实不然,我翻车了!!!在实际使用时却会有问题,如
int iOffset;
WORD wOadNum;
//方式1:计算出错了
FILE_PER_OAD_BASE_OFFSET(wOadNum-1);
//方式2:计算正确
iOffset = wOadNum - 1;
FILE_PER_OAD_BASE_OFFSET(iOffset );
原因是宏展开时,
方式1为:
FILE_OAD_NUM_LEN + (FILE_PER_OAD_FIX_DAT_LEN*OAD_NUM-1)
方式2为:
FILE_OAD_NUM_LEN + (FILE_PER_OAD_FIX_DAT_LEN*iOffset )
到这里,问题出现了吧,是由于宏内部的传入参数没有加括号,即宏定义需改为如下
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM) (FILE_OAD_NUM_LEN + (FILE_PER_OAD_FIX_DAT_LEN*(OAD_NUM)))