相关疑难解决方法(0)

命名循环成语:危险?

我在C++中读过一篇关于"命名循环习语"的文章:http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Loop

这个成语允许我们写这样的东西:

named(outer) 
for(int i = 0 ; i < rows ; ++i) {

   named(inner) 
   for(int j = 0 ; j < cols ; ++j) {

        if(some_condition)
            break(outer);   // exit the 'outer' loop 

   }
}
Run Code Online (Sandbox Code Playgroud)

这样的构造已经作为许多语言的核心特征存在,例如Java.

根据这篇文章,它可以通过定义两个邪恶的宏来用C++实现:

#define named(blockname) goto blockname; \
                         blockname##_skip: if (0) \
                         blockname:

#define break(blockname) goto blockname##_skip;
Run Code Online (Sandbox Code Playgroud)

我知道很多人都想放弃使用goto.我个人发现它在极少数情况下很有用,特别是当我想要break一堆嵌套循环时.这个成语在我看来是一个更清洁的解决方案,但是可以在实际代码中使用它吗?

在本文的讨论页面上,可以阅读:

"不要这样做.你最终会陷入地狱"

所以我的问题是:使用命名循环习语什么缺点?危险吗 ?如果是,为什么?

奖金问题:是否有可能continue同样实施命名?(我认为使用named(...) for(...;...;...) {}语法是不可能的,但谁知道呢?)

编辑:我同意你的意见,重新定义关键字是令人讨厌的.那么使用#define breakLoop()呢?

c c++

14
推荐指数
1
解决办法
1717
查看次数

标签 统计

c ×1

c++ ×1