这两个定义有什么区别

时间:2017-11-09 00:30:41

标签: c c99

在下文中,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);
}

1 个答案:

答案 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只是告诉编译器如何表示值,没有别的。