首页 > 解决方案 > C ++宏忽略之后的内容

问题描述

我正在研究一个动态编程问题,并决定不使用 std::max 函数,因为我认为宏会更快(没有在堆栈上推送参数,而不是模板化)。

但它并没有完全按预期工作。我已经隔离了这个问题,它看起来像这样:

#include <iostream>
#define maxi(a, b) (a <= b)? b : a

using namespace std;

int main()
{
    int a = 0, b = 0, c = 0;
    c =  maxi(a, b) + 1;
    cout << c;
    return 0;
}

虽然它确实返回了最大值,但它似乎忽略了之后添加的 1。在此示例中,c 的值最终为 0,而我希望它为 1。这是为什么呢?

标签: c++macros

解决方案


宏替换后的代码如下所示。你现在明白哪里错了吗?

// ...
int a = 0, b = 0, c = 0;
c =  (a <= b)? b : a + 1;

要快速修复,只需将所有宏放入附加 () 作为#define maxi(a, b) ((a <= b)? b : a). 当您编写任何宏时,这是一个很好的做法。该更改将导致代码发生以下更改:

// ...
int a = 0, b = 0, c = 0;
c =  ((a <= b)? b : a) + 1;

请记住,如果您的 a 和 b 参数更复杂,您将遇到类似的问题,因此要使宏更容易出错,您应该将所有参数也放在单独的 () 中,如#define maxi(a, b) (((a) <= (b))? (b) : (a))


推荐阅读