评估宏中传递的参数

时间:2017-10-24 16:34:11

标签: c++ c++11 macros c++14

#define prod(a) (a*a)
using namespace std;
int main()
{
  int i = 3, j, k, l;
  j = prod(i++);
  cout << i << endl;
  k = prod(++i);
  cout << i << endl;
  l = prod(i+1);

  cout << i << " " << j << " " << k << " " << l;
}

为什么变量“i”会递增两次?

,即j=prod(i++);

之后的3比3

2 个答案:

答案 0 :(得分:2)

请记住,源代码中的宏已扩展,而不是实际调用或评估。

这意味着像“

”这样的“召唤”
prod(i++)

导致扩展代码

i++*i++

被编译器看到。

许多编译器允许您在预处理之后停止,或以其他方式生成预处理源,您可以检查它们以查看宏扩展。

如果你继续使用这样的宏和其他表达式作为参数,你很快就会看到他们不好的另一个原因。

让我们说你用

prod(2+4)

然后这将导致扩展

2+4*2+4

等于

2+(4*2)+4

等于14,而不是可能预期的36。

答案 1 :(得分:1)

  

为什么变量&#34;我&#34;递增两次?即在j = prod(i ++)

之后从3到3

因为prod()是宏,而不是函数,所以

k=prod(++i);

成为

k=(++i * ++i);