2

以下#define部分有效:

#define OUT(x) \
   if(x > 0) cout << "Hello "; \
   if(x > 1) cout << x+1

OUT(1) << "message";     // OK

if(0) {
   OUT(1) << "message";     // OK, nothing printed
}

if(0)
   OUT(1) << "message";     // NO, printed anyway

我明白为什么它不起作用(if(0)仅适用于if(x > 0))。
我找不到让它工作的方法。考虑到我不能在定义中放大括号,否则我将不允许使用插入运算符。

4

2 回答 2

5

更新为打印“你好”

可以这样做(哦,丑陋!):

#define OUT(x) if((x > 0 ? cout << "Hello " : cout), x > 1) cout << x+1

这是一个“标准”逗号运算符技巧,它允许在if条件内评估其他表达式,而不会影响最后采用的分支。

在这种情况下,添加了一个表达式:计算原始条件的三元运算符x > 0。产生所需副作用的表达式(不是语句,但此限制在这里无关紧要)放置在三元的“真”分支中。“假”分支的计算结果根本不重要,只要它与“真”分支的结果类型相同(或可以隐式转换为)。

这里的“真”分支返回一个ostream&,所以最简单的方法是也cout从“假”分支返回并收工。

回答原始问题

在最初发布的情况下(使用xand y),宏将是

#define OUT(x) if((x > 0 ? y = x : 0), x > 1) cout << x+1

对于这种特定情况,也可以写成

#define OUT(x) if((y = x > 0 ? x : y), x > 1) cout << x+1

看到它在行动

于 2012-05-16T10:34:48.013 回答
2

创建一个返回对 的引用的函数,std::cout然后在您的 MACRO 中使用此函数。

#define OUT(x) MyOut( x, y )

MyOut 是:

std::ostream& MyOut( int x, int& yRef )
{
    if(x > 0) yRef = x;
    if(x > 1) 
    {
        std::cout << x+1;
        return std::cout;
    }
    return SomeNoOpOstream;
}
于 2012-05-16T10:27:11.387 回答