我在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()呢?