c++:宏似乎有点奇怪

C++: a macro seems to be a bit strange

本文关键字:c++      更新时间:2023-10-16

我刚开始学习c++。请原谅我提出这样的问题。我的任务是写一个宏来计算周长并进行测试。

#define _USE_MATH_DEFINES
#include <cmath>
#define LENGTH(radius) (2 * M_PI * radius)
float l1 = LENGTH(1 + 2); // The result should be 18.8495... I have 8.28. Incorrect result.
float l2 = 1 / LENGTH(2); // The result should be  0.07957... Working correctly.

我添加了一对额外的parenthethis:

float l1 = LENGTH((1 + 2)); // Correct result.

如何写这样一个宏,我得到正确的结果,而不添加额外的括号?

use:

#define LENGTH(radius) (2 * M_PI * (radius))

float l1 = LENGTH(1 + 2);

与您的定义预处理器将其转换为

float l1 = 2 * M_PI * 1 + 2

始终,始终,在()中包装宏参数-无论它看起来多么微不足道,您迟早会需要它。

当然,写一个函数做同样的事情有几个好处:1. 你可以在调试器中进入它,这样你就能知道发生了什么。2. 宏参数表达式没有什么奇怪之处。为了解释第二点,假设我们使用宏有以下代码:
 // Print 10 lengths, 3, 5, 7, ... 
 int x = 3;
 for(i = 0; i < 10; i++)
 {
      printf("Length of radius %d is %5.2fn", x, LENGTH(x += 2));
 }

现在,有人参加了一个优化课程,并意识到2*某事比某事+某事更快,所以重写你的宏以更快:

 #define LENGTH(radius) (((radius) + (radius)) * M_PI)

现在,由于我们在LENGTH宏中有x+=2,奇怪的事情发生了(它成为未定义的行为,因为相同的变量在同一语句中更新了两次[是的,我的意思是在两个序列点之间]。如果有一个length函数,它将像您所期望的那样完美地工作。

不要对使用宏——内联函数在各方面都更好

但是发生的事情很容易理解,理解它有助于了解为什么最好避免使用宏。

#define LENGTH(radius) (2 * M_PI * radius)
float l1 = LENGTH(1 + 2);
宏只是一个简单的文本替换,所以上面的代码被替换为:
float l1 = (2 * M_PI * 1 + 2);

显然有错误的运算符优先级

相关文章:
  • 没有找到相关文章