gpt4 book ai didi

c++ - 命名循环成语 : dangerous?

转载 作者:IT老高 更新时间:2023-10-28 22:39:14 25 4
gpt4 key购买 nike

我读过一篇关于 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 一堆嵌套循环时。这个成语在我看来是一个更干净的解决方案,但可以在实际代码中使用它吗?

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

"Do not do this. You'll end up in hell"

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

额外问题:是否可以类似地实现命名的 continue ? (我认为使用 named(...) for(...;...;...) {} 语法是不可能的,但谁知道呢?)

编辑:我同意你的观点,重新定义关键字很讨厌。使用 #define breakLoop() 怎么样?

最佳答案

正如评论中所述,#defining break 是有问题的。假设您使用其他东西。

我仍然认为这很危险。这是一个非常不寻常的习语(对 C++ 程序员而言),因此他们不太可能理解,因此他们可能会做出重大更改。鉴于完成同一件事的方式不那么令人惊讶,因此也不那么危险,我建议不要这样做。

考虑将循环放在函数或 lambda 中。然后你可以 return 跳出外循环。作为一个好处,您可以返回有关过早退出的信息,这可能对外部代码有用。

关于c++ - 命名循环成语 : dangerous?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11005822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com