C++预处理器宏中的代码块在没有大括号的情况下不起作用
Code block in a C++ preprocessor macro does not work without braces
以下#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
并调用它一天。
对原始问题的回答
在最初发布的情况下(带有x
和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
看到它的实际效果。
创建一个返回对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;
}
相关文章:
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- EOF有更安全的替代方案吗?它在我的情况下不起作用
- c++ 选择排序在特定情况下不起作用
- 为什么在这种情况下,前向声明不起作用?
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 将指针传递给函数在简单的情况下有效,但在"class" -izing 之后不起作用
- 在某些情况下,多个 OpenGL 纹理不起作用?
- 句子转换器在存在新行的情况下不起作用
- 为什么 std::void_t 在这种情况下不起作用
- 为什么在这种情况下 boost::recursive_wrapper 不起作用
- C++中的dynamic_cast在没有 RTTI 的情况下不起作用;为什么?
- 为什么在这种情况下创建临时实例不起作用?
- 为什么SFINAE在这种情况下不起作用?
- 为什么在这种情况下转发引用不起作用?
- 运算符重载如何工作,为什么在我的情况下不起作用?
- 在这种情况下,过载不起作用
- 请帮助我理解为什么SFINAE在这种情况下不起作用
- 为什么#ifndef在这种情况下不起作用
- 为什么c_str在这种打开(文件名)的情况下不起作用
- ADL在特定情况下不起作用