typedef unsigned int UINT;
#define SetBlockHeadSize(pInfo, dwords) ( (*(pInfo) &= 0x3 ) |= ( (dwords)<<2) )
#define GetBlockHeadSize(pInfo) ( *(pInfo) >> 2 ) //返回DWORD数
int main(int argc, char* argv[])
...{
UINT a1 = 0x10;
UINT a2 = 0x10;
SetBlockHeadSize( &a1, GetBlockHeadSize(&a1)+GetBlockHeadSize(&a2) );
return 0;
}SetBlockHeadSize( &a1, GetBlockHeadSize(&a1)+GetBlockHeadSize(&a2) )执行时,
首先执行表达式*(&a1)&= 0x3,就改变了a1的值,所以后面GetBlockHeadSize(&a1)计算的值不是预期的了。
改正:先计算int newSize = GetBlockHeadSize(&a1)+GetBlockHeadSize(&a2)的值
或者改成:#define SetBlockHeadSize(pInfo, dwords) ( *(pInfo) = *(pInfo) &0x3 |( (dwords)<<2) )
或者定义成函数,
void setBlockHeadSize( UINT* pInfo, UINT dwords )
{
(*(pInfo) &= 0x3 ) |= ( (dwords)<<2);
}
本文探讨了C语言中宏定义SetBlockHeadSize的一个常见陷阱,即改变参数值导致逻辑错误,并提供了三种改进方案:使用临时变量、调整宏定义方式及转换为函数形式。
1849

被折叠的 条评论
为什么被折叠?



