【问题标题】:Macro in an expression is not working as expected表达式中的宏未按预期工作
【发布时间】:2019-10-24 18:36:29
【问题描述】:

我有一个简单的宏来添加 2 个变量,但没有按预期工作。

#include <iostream>
using namespace std;
#define ADD(x,y) (x+y);

int main() {
    int a = 10;
    int b = 1;
    int c = ADD(a,b)+1; //c=11 - NOT EXPECTED
    int c = 1+ADD(a,b); //c=12 - EXPECTED

    cout<< c;
}

在上面的代码中,当我在宏的开头添加 1 时,它给出了预期的输出。但如果我在最后加 1,它实际上并没有加 1。

为什么会有这种行为? 据我所知,当使用宏时,编译器只会在编译期间将宏替换为令牌字符串。如果是这样,在这两种情况下,输出应该是相同的。

第一种情况:c = (a+b)+1 第二种情况c = 1+(a+b)

【问题讨论】:

  • 删除宏末尾的;。同时删除宏。

标签: c++ macros


【解决方案1】:

把宏末尾的分号去掉,写成这样

#define ADD(x,y) (( x ) + ( y ))

否则比如这一行

int c = ADD(a,b)+1;

等价于

int c = (a + b); +1;

即它包含变量c 的声明和语句

+1;

没有效果。

【讨论】:

  • 更好,删除宏。 1 + 1ADD(1, 1) 清晰很多。
  • 是的,我同意 a+b 比宏清晰得多。在这里,我只是想了解宏的行为。因此,这个简单的代码。
猜你喜欢
  • 1970-01-01
  • 2014-04-28
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多