这两个定义有什么区别

What is the difference between these two defines

在下文中,MY_INT2 和 MY_INT3 声明有什么区别? 我在某些代码中有一个相当根深蒂固的问题,因此将生成错误的代码减少到测试用例中将是相当具有挑战性的。

#define MY_INT1 5
#define MY_INT2 31
#define MY_INT3 (int) pow(2, MY_INT1)-1

我在我的代码中遇到了一些问题,这些问题已通过使用以下方法解决,感觉非常没有必要

int mul(int a, int b) {
    return a*b;
}

int someFunction(int in) {
     //nice
     return floor(in/MY_INT2);
}

int someFunction2(int in) {
     //silly
     return floor(in/mul(1,MY_INT3));
}

int someFunction3(int in) {
     //cast does not solve the issue
     return floor(in/(int)MY_INT3);
}

宏是文本替换。没有括号 in / (int) MY_INT3 实际上是

in / (int) (int) pow(2, 5) - 1;

相同
in / 32 - 1;

所以-1在除法后被减去。

此外,mul(1, MY_INT3) 之所以有效,是因为参数在传递给函数时被求值,实际上

in / (MY_INT3);

也应该像您期望的那样“工作”。

您似乎认为转换是解决问题的魔术,但事实并非如此。转换只是告诉编译器如何表示值,没有别的。