C++预处理器宏中的代码块在没有大括号的情况下不起作用

Code block in a C++ preprocessor macro does not work without braces

本文关键字:不起作用 情况下 处理器 预处理 C++ 代码      更新时间:2023-10-16

以下#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)(。
我找不到让它工作的方法。考虑到我不能在定义中放置大括号,否则我将不被允许使用插入运算符。

更新为打印"Hello">

它可以这样做(哦,丑陋!

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

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

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

这里 "true" 分支返回一个 ostream& ,所以最简单的方法是也从 "false" 分支返回 cout 并调用它一天。

对原始问题的回答

在最初发布的情况下(带有xy(,宏将是

#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

看到它的实际效果

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

#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;
}