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
始终,始终,在()
中包装宏参数-无论它看起来多么微不足道,您迟早会需要它。
// 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);
显然有错误的运算符优先级
相关文章:
- 没有找到相关文章