在下文中,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);
}
答案 0 :(得分:1)
宏是文本替换。没有括号in / (int) MY_INT3
实际上是
in / (int) (int) pow(2, 5) - 1;
与
相同in / 32 - 1;
所以在分割后减去-1
。
此外,mul(1, MY_INT3)
有效,因为参数在传递给函数时会被评估,实际上是
in / (MY_INT3);
也应该像你期望的那样“工作”。
看来你认为施法是一个神奇的问题解决方法,但事实并非如此。 Casting只是告诉编译器如何表示值,没有别的。