2010-10-03 126 views
0

我不明白为什么我的程序做了这样的计算:奇怪的计算

#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

怎么了?

回答

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; 

其除以9.81mHeight然后乘以40.0的结果。这不是你想要的。你想要mHeight除以9.8140.0的乘积因此括号。

你总能看到您的宏是如何被扩展之前,你的文件使用的g++-E选项,也适用于编译:

g++ -Wall -E myfile.cpp 

编辑:

它也最好附上宏括号中的参数也是如此,如果你传递一个表达式(如说:Meters2Pixels(foo + 2)

#define Meters2Pixels(meters) ((float)(meters)*PixelsPerMeter) 
#define Pixels2Meters(pixels) ((float)(pixels)/PixelsPerMeter) 
+1

我还建议在括号内附上宏参数,以防您传入的值将您的运算符优先级更改为不合需要的值。 – mdec 2010-10-03 12:52:17

+0

很好的答案,谢谢。是的,宏是邪恶的:) – Ockonal 2010-10-03 12:58:32

+0

宏不是邪恶的,但我不认为这是一个很好的用例。 – alternative 2010-10-03 13:03:54

3

为了避免使用宏的麻烦,您应该考虑使用内联函数。