我读过一篇关于 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
}
}
这种结构已经作为许多语言的核心特性存在,例如 Java。
根据文章,它可以通过定义两个邪恶的宏在 C++ 中实现:
#define named(blockname) goto blockname; \
blockname##_skip: if (0) \
blockname:
#define break(blockname) goto blockname##_skip;
我知道很多人想禁止使用goto
. 我个人发现它在极少数情况下很有用,尤其是当我想要break
一堆嵌套循环时。在我看来,这个成语是一个更干净的解决方案,但是可以在实际代码中使用它吗?
在文章的讨论页面上,可以阅读:
“不要这样做。你会下地狱的”
所以我的问题是:使用命名循环习语有什么缺点?危险吗 ?如果是,为什么?
额外的问题:是否可以实现continue
类似的命名?(我认为使用语法是不可能的named(...) for(...;...;...) {}
,但谁知道呢?)
编辑:我同意你的看法,重新定义关键字很讨厌。用什么#define breakLoop()
代替呢?