宏C/C++的奇怪行为

我正在使用一些宏,并观察一些奇怪的行为.

我已经将PI定义为常量,然后在宏中将其用于将度数转换为弧度,将弧度转换为度数.弧度到弧度的工作正常,但弧度到度数不会:

piTest.cpp:

#include <cmath>
#include <iostream>
using namespace std;

#define PI atan(1) * 4
#define radians(deg)  deg * PI / 180
#define degrees(rad)  rad * 180 / PI

int main()
{
  cout << "pi: " << PI << endl;
  cout << "PI, in degrees: " << degrees(PI) << endl;
  cout << "45 degrees, in rad: " << radians(45) << endl;
  cout << "PI * 180 / PI: " << (PI * 180 / PI) << endl;
  cout << "3.14159 * 180 / 3.14159: " << (3.14159 * 180 / 3.14159) << endl;
  cout << "PI * 180 / 3.14159: " << (PI * 180 / 3.14159) << endl;
  cout << "3.14159 * 180 / PI: " << (3.14159 * 180 / PI) << endl;

  return 0;

}

当我编译并运行时,我得到以下输出:

pi: 3.14159
PI, in degrees: 2880
45 degrees, in rad: 0.785398
PI * 180 / PI: 2880
3.14159 * 180 / 3.14159: 180
PI * 180 / 3.14159: 180
3.14159 * 180 / PI: 2880

似乎我的常数PI在分子中起作用,但不是分母.我在C中观察到相同的行为.我正在运行gcc版本4.6.3

任何人都可以解释为什么我会得到这种行为?

最佳答案
宏是(相对简单的)文本替换.

在定义中使用括号(包括宏本身和宏参数):

#define PI (atan(1) * 4)
#define radians(deg)  ((deg) * PI / 180)
#define degrees(rad)  ((rad) * 180 / PI)

转载注明原文:宏C/C++的奇怪行为 - 代码日志