如果和宏观悬挂

时间:2017-12-15 10:49:37

标签: c++ macros gcc-warning

我需要摆脱警告,其中一个是-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)

我必须承认,我并没有真正进入这个宏,因此不知道如何解决这个警告。

有人可以帮我解释如何避免悬空吗?

2 个答案:

答案 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) { }