这是2个代码段,一个是宏,一个是函数。它们似乎做同样的事情,但是运行它们之后,似乎它们表现出不同的行为,我不知道为什么。有人可以帮我吗?谢谢!

#define ROL(a, offset) ((((Lane)a) << ((offset) % LANE_BIT_SIZE)) ^ (((Lane)a) >> (LANE_BIT_SIZE-((offset) % LANE_BIT_SIZE))))

Lane rotateLeft(Lane lane, int rotateCount)
{
    return ((Lane)lane << (rotateCount % LANE_BIT_SIZE)) ^ ((Lane)lane >> (LANE_BIT_SIZE - (rotateCount % LANE_BIT_SIZE))) ;
}


注意:Lane类型只是一个无符号的int,而LANE_BIT_SIZE是一个数字,表示位数(以位数表示)Lane的大小。

最佳答案

可以考虑使用宏代替将宏的主体替换为您使用宏的位置。

例如,假设您要定义一个宏:#define quadruple(a) ((a) * (a) * (a) * (a))

...那么您将像这样使用该宏:

int main(void) {
    int x = 1;
    printf("%d\n", quadruple(x++));
}


您希望在这里发生什么?将宏替换为代码会导致:

int main(void) {
    int x = 1;
    printf("%d\n", ((x++) * (x++) * (x++) * (x++)));
}


事实证明,此代码使用未定义的行为,因为它在同一表达式中多次修改了x。那不好!您是否认为这可以解释您的行为差异?

关于c - 这两个代码段的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15194419/

10-11 19:40