我需要摆脱警告,其中一个是-Wdangling-else。它注意到如果在以下宏定义中悬挂:
#define FOR_EACH_REF(var, container) \
if(bool _cont = true) \
for(our::remove_reference<decltype(container)>::type::iterator _it = (container).begin(); _it != (container).end() && _cont; ++_it) \
if((_cont = false)) {} else \
for(our::remove_reference<decltype(container)>::type::value_type& var = *_it; !_cont; _cont = true)
我必须承认,我并没有真正进入这个宏,因此不知道如何解决这个警告。
有人可以帮我解释如何避免悬空吗?
答案 0 :(得分:3)
您可以撤消条件以避免出现空if-block而导致问题else
:
#define FOR_EACH_REF(var, container) \
if (bool _cont = true) \
for(our::remove_reference<decltype(container)>::type::iterator _it = (container).begin(); _it != (container).end() && _cont; ++_it) \
if(!(_cont = false)) \
for(our::remove_reference<decltype(container)>::type::value_type& var = *_it; !_cont; _cont = true)
从C ++ 11开始,它甚至可以很容易地编写:
#define FOR_EACH_REF(var, container) for (auto& var : container)
答案 1 :(得分:2)
如何避免悬空呢?
最简单(也不推荐)的选项是使用-Wno-dangling-else
禁用编译器中的警告。
真正的解决方案是在if
/ else
分支周围添加大括号:
#define FOR_EACH_REF(var, container) \
if(bool _cont = true) { \
for(/* ... */) \
if((_cont = false)) {} else { \
for(/* ... */)
#define FOR_EACH_REF_END }}
用法:
FOR_EACH_REF(foo, bar)
{
}
FOR_EACH_REF_END
如果你想迭代一个范围,C ++ 11为它提供了语言语法,应该使用它来代替这个可恶的宏:
for(const auto& var : container) { }