表达中的DEFINE()宏用法

xor*_*xor 2 c++ c-preprocessor

所以我定义..

#define RADIAN(x) x*3.14159265f/180.0f
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

RADIAN(theta-90)
Run Code Online (Sandbox Code Playgroud)

我的程序经常给我不正确的结果,我花了几个小时才意识到上述声明和下面的声明之间存在巨大差异.

RADIAN((theta-90))
Run Code Online (Sandbox Code Playgroud)

现在我的程序运行得很好.为什么第一个陈述不正确?

x13*_*13n 7

#define只做文本替换,所以RADIAN(theta-90)真的theta-90*3.14159265f/180.0f,显然不是你的意思.尝试

#define RADIAN(x) ((x)*3.14159265f/180.0f)
Run Code Online (Sandbox Code Playgroud)

代替.

  • +1如果你真的想使用宏,总是在参数周围添加括号,如@ x13n所做的那样,并且要注意其他陷阱,包括因为它是*text*substitution,表达式可能会被多次评估:`#define MAX(x,y)((x)<(y)?(y):(x))`将两次计算'x`或`y`之一,因此`MAX(sqrt(100),sqrt(4) `;将调用`sqrt(100)`两次和`sqrt(4)`一次......内联函数简单得多:) (4认同)
  • 或者更好的是,`inline float RADIAN(float x){return x*3.14159265f/180.0f;}`以避免宏的所有陷阱. (3认同)