我无法理解为什么我的程序会进行这样的计算:
#define PixelsPerMeter 40.0
// 40 pixels ~ 1 meter
#define Meters2Pixels(meters) (float)meters*PixelsPerMeter
#define Pixels2Meters(pixels) (float)pixels/PixelsPerMeter
// The speed of free falling
#define G Meters2Pixels(9.81)
// ...
float mHeight = 768;
float _windPower = Meters2Pixels(-5.0);
// ...
float x1 = ( mHeight / G ) * _windPower;
cout << "G: " << G << "; wind: " << _windPower << "\n";
cout << "Height: " << mHeight << "\n";
cout << "Calculating: " << mHeight / G * _windPower << "\n";
=>
G: 392.4; wind: -200
Height: 768
Calculating: -626300
我无法理解为什么......例如,如果我用手计算,我必须得到: 的 -391.4
怎么了?
答案 0 :(得分:4)
您需要将括号中的宏展开括起来:
#define Meters2Pixels(meters) ((float)meters*PixelsPerMeter)
#define Pixels2Meters(pixels) ((float)pixels/PixelsPerMeter)
C / C ++预处理器进行盲目替换。如果没有括号,x1
将被计算为:
float x1 = ( mHeight / (float)9.81*40.0 ) * _windPower;
将mHeight
除以9.81
,然后将结果与40.0
相乘。这不是你想要的。您希望将mHeight
除以9.81
和40.0
的乘积,从而得括号。
您可以使用-E
的{{1}}选项始终查看在文件进行编译之前如何扩展宏:
g++
修改强>
最好也将宏参数括在括号中,如果你传递一个表达式,这将保护你(比如说g++ -Wall -E myfile.cpp
:
Meters2Pixels(foo + 2)
答案 1 :(得分:3)
为避免出现宏问题,您应该考虑使用内联函数。